Java:将 Collection.sort 和 lambda 表达式与三元运算符结合使用会导致意外结果

标签 java

我有以下类(class):

import java.util.*;

class ClassA {
    public static void main(String...args) {
        var list = new ArrayList<String>();
        list.add("test");
        list.add("abc");

        Collections.sort(list, (a, b) -> a.length() >= b.length() ? 1 : 0); // [test, abc]
        //Collections.sort(list, (a, b) -> a.compareTo(b));                 // [abc, test]

        System.out.println(list);
    }
}

我认为 Collection.sort() 会按顺序排序。我认为 a.length() 是 4 而 b.length() 是 3,这将评估为 (4 >= 3) true。所以 a.length() >= b.length() ? 1 : 0 将返回 1,表示 "test" 大于 "abc"。所以它应该像 [abc, test] 一样排序。

但是当我将代码更改为 a.length() >= b.length() 时,我只会得到结果 [abc, test] 吗? 1 : -1,这似乎表明 a.length() >= b.length() 的计算结果为 false。这是为什么?

为什么第一个 lambda 表达式导致 [test, abc],而修改后的版本导致 [abc, test]

Collections.sort(list, (a, b) -> a.compareTo(b)); 按预期工作。

最佳答案

阅读 Comparator 的文档: compare ,或者你用来实现它的 lambda,如果 a < b 必须返回一个负值,如果 a > b 不只是一个正值.如果 a,它也必须返回零等于(或比较等于)b .这与其他一些编程语言的预期不同,我想这就是让您感到困惑的地方。

这将是一个完全有效的 sort 实现从不关注积极的输出,只关注消极的输出。它似乎没有按照您预期的顺序进行比较。

您可以将此比较器正确实现为 (a, b) -> Integer.compare(a.length(), b.length()) ,或更简单地表示为 Comparator.comparingInt(String::length) .

关于Java:将 Collection.sort 和 lambda 表达式与三元运算符结合使用会导致意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67654568/

相关文章:

java - 我的 Append 方法在 Java 中不起作用

java - whatsapp 和即时消息应用程序如何在没有奥利奥持久通知的情况下在后台工作?

使用 aws sdk 的 Java Applet 访问被拒绝

java - 如何在 JTable 中正确实现 JComboBox?

java - 在 Eclipse 中自定义搜索(文件)功能

java - 获取日志处理程序中的行号

java - 如何根据列表中的两个不同值获取 2 个计数并检查两个计数是否相等?

java - WSDL 生成的 SOAPClient 无效 SOAP 1.1 消息

java - 如何使用java在智能卡上安装applet

java - Java中无法指定类路径