作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个比较整数(可以为空),所以
我尝试使用 Comparator.comparingInt
,但它不起作用:
public static final Comparator<Task> sort =
Comparator.comparingInt(x -> x.getNumber(),
Comparator.nullsLast(null));
The method comparingInt(ToIntFunction<? super T>)
in the type Comparator is not applicable for
the arguments ((<no type> x) -> {}, Comparator.nullsLast(null))
comparing
而不是
comparingInt
, 有用:
public static final Comparator<Task> sort =
Comparator.comparing(x -> x.getNumber(),
Comparator.nullsLast(null));
Comparator.nullsLast
结合
Comparator.comparingInt
?.
最佳答案
Integer
和 int
不一样。特别是,任何比较整数的尝试都无法处理 null
,你在这里确实需要它,所以它就出来了。使用 comparing
. comparingInt
方法,它只需要一个:一个 lambda 将给定的 Task
成int
.这不是你使用的方式 nullsLast
. Integer
来自您的 Task
,然后使用 nullsLast
实现排序比较器。这意味着空值将是最后的,是的,并且所有其他整数将按任意顺序排列 .正如我所说,这不是您使用 nullsLast
的方式. nullsLast
:
someListOfTasks.sort(Comparator.nullsLast(Comparator.comparing(task::getNumber)));
someListOfTasks.sort(Comparator.comparing(task::getNumber, Comparator.nullsLast(Comparator.naturalOrder())));
someListOfTasks.sort(Comparator.nullsLast(Comparator.comparing(task::getNumber, Comparator.nullsLast(Comparator.naturalOrder()))));
Comparator.comparing(valueExtractor, valueComparator)
是通用语法。您可以省略
valueComparator
部分,在这种情况下,您将获得所谓的“自然排序”。对于整数,它是
0,1,2,3,4....
——显而易见的。对于随机对象,如果它们实现
Comparable
(这是
java.lang.Integer
),但是
compareTo
您尝试排序的对象的方法已实现。
compareTo
与在任何空引用上调用任何实例方法所做的事情相同:它抛出
NullPointerException
)。您可以不使用自然顺序来“修复”这个问题,而是使用 nullsFirst 或 nullsLast 比较器。那些“包装”一个比较器,因此语法是:
Comparator.nullsLast(comparatorToWrap)
comparatorToWrap
.在您发布的片段中,您传入了
null
为
comparatorToWrap
这里。
nullsLast
的规范明确指出:这意味着所有非空值都被认为是相等的,这意味着,如果排序列表,任意顺序,对于映射/集合,只有 1 个非空键:
无论哪种方式,都不是您想要的 .您显然希望具有非空数字的任务根据整数的自然顺序进行排序,即编号为“1”的任务的排序应高于编号为“2”的任务。因此,传入自然顺序比较器:
Comparator.nullsLast(Comparator.naturalOrder())
– 这意味着:首先将所有空值排序到最后,然后根据此处的自然情况对其余部分进行排序。
task.getNumber()
返回,因此为什么我们首先需要一个 lambda 来提取(所以,
Task::getNumber
或
x -> x.getNumber()
;这些意思相同),然后我们传入我们的
Integer
比较器启动:
Comparator<Integer> sortIntegersNaturallyWithNullsLast = Comparator.nullsLast(Comparator.naturalOrder());
Function<Task, Integer> extractNumber = Task::getNumber;
listOfTasks.sort(Comparator.comparing(extractNumber, sortIntegersNaturallyWithNullsLast));
public class Task implements Comparable<Task> {
private Integer number;
.. rest of class here ..
@Override public int compareTo(Task other) {
Integer o = other.number;
if (number == null && o == null) return 0;
if (number != null) return -1;
if (o != null) return +1;
return number.compareTo(o);
}
}
Comparator.naturalOrder()
:
listOfTasks.sort(Comparator.naturalOrder())
.
关于java - Comparator.nullsLast 与 Comparator.comparingInt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60485232/
这个问题在这里已经有了答案: Generic type inference not working with method chaining? (2 个答案) 关闭 6 年前。 我需要对点列表进行排
假设我想以相反的顺序对字段 height 上的 ArrayList 中的对象进行排序,如果两个值相同,我想进一步对字段宽度进行排序也以相反的顺序。有没有办法使用类似的东西 Comparator co
我有一个比较整数(可以为空),所以 我尝试使用 Comparator.comparingInt ,但它不起作用: public static final Comparator sort = Compa
我正在尝试对 Interval 类列表进行排序: class Interval { int start; int end; Interval() { start = 0; en
我是一名优秀的程序员,十分优秀!