gpt4 book ai didi

java - Comparator.nullsLast 与 Comparator.comparingInt

转载 作者:行者123 更新时间:2023-12-02 01:02:29 26 4
gpt4 key购买 nike

我有一个比较整数(可以为空),所以

我尝试使用 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));

但我想知道为什么因为我想比较 Integers 所以 compareInt 将是正确的选择。

我如何使用 Comparator.nullsLast结合 Comparator.comparingInt ?.

最佳答案

  • Integerint不一样。特别是,任何比较整数的尝试都无法处理 null ,你在这里确实需要它,所以它就出来了。使用 comparing .
  • 您的第一个代码段不起作用,因为您将 2 个参数传递给 comparingInt方法,它只需要一个:一个 lambda 将给定的 Taskint .这不是你使用的方式 nullsLast .
  • 你的第二个片段确实有效,但它做了一些完全不同的事情:它首先提取一个 Integer来自您的 Task ,然后使用 nullsLast 实现排序比较器。这意味着空值将是最后的,是的,并且所有其他整数将按任意顺序排列 .正如我所说,这不是您使用 nullsLast 的方式.

  • 这就是你如何使用 nullsLast :

    案例:您的任务列表包含 null 而不是任务:
    someListOfTasks.sort(Comparator.nullsLast(Comparator.comparing(task::getNumber)));
    案例:您的任务列表包含一个数字为 null 的任务:
    someListOfTasks.sort(Comparator.comparing(task::getNumber, Comparator.nullsLast(Comparator.naturalOrder())));
    (我想这就是你想要的)

    案例:您的任务列表包含空值而不是任务,以及一些任务为空值的数字:
    someListOfTasks.sort(Comparator.nullsLast(Comparator.comparing(task::getNumber, Comparator.nullsLast(Comparator.naturalOrder()))));
    这可能会让人觉得相当冗长,但请注意,一个 null 与另一个没有关系,您可能希望空任务条目先排序,而具有空数字的非空任务最后排序。您的问题中没有任何内容表明您的列表中有空任务,因此您需要第二个示例。

    那么它是什么意思呢?
    Comparator.comparing(valueExtractor, valueComparator)是通用语法。您可以省略 valueComparator部分,在这种情况下,您将获得所谓的“自然排序”。对于整数,它是 0,1,2,3,4.... ——显而易见的。对于随机对象,如果它们实现 Comparable (这是 java.lang.Integer),但是 compareTo您尝试排序的对象的方法已实现。

    请注意,根据定义,自然顺序无法处理空值(毕竟,尝试在空值上调用 compareTo 与在任何空引用上调用任何实例方法所做的事情相同:它抛出 NullPointerException )。您可以不使用自然顺序来“修复”这个问题,而是使用 nullsFirst 或 nullsLast 比较器。那些“包装”一个比较器,因此语法是:
    Comparator.nullsLast(comparatorToWrap)
    这意味着:首先,将所有空值排序到最后。然后,要比较所有非空条目,请使用 comparatorToWrap .在您发布的片段中,您传入了 nullcomparatorToWrap这里。 nullsLast的规范明确指出:这意味着所有非空值都被认为是相等的,这意味着,如果排序列表,任意顺序,对于映射/集合,只有 1 个非空键: 无论哪种方式,都不是您想要的 .您显然希望具有非空数字的任务根据整数的自然顺序进行排序,即编号为“1”的任务的排序应高于编号为“2”的任务。因此,传入自然顺序比较器: Comparator.nullsLast(Comparator.naturalOrder()) – 这意味着:首先将所有空值排序到最后,然后根据此处的自然情况对其余部分进行排序。

    然后,您想将这个概念(“最后排序空值,其余按自然顺序排序”)不是应用于任务本身,而是应用于任何 task.getNumber()返回,因此为什么我们首先需要一个 lambda 来提取(所以, Task::getNumberx -> 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/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com