当前位置: 首页 > 知识库问答 >
问题:

Java8 Lambda:比较器

越正阳
2023-03-14

我想用Lambda对列表排序:

List<Message> messagesByDeviceType = new ArrayList<Message>();      
messagesByDeviceType.sort((Message o1, Message o2)->o1.getTime()-o2.getTime());

但我得到了这个编译错误:

 Multiple markers at this line
    - Type mismatch: cannot convert from long to int
    - The method sort(Comparator<? super Message>) in the type List<Message> is not applicable for the arguments ((Message o1, Message o2) 
     -> {})

共有3个答案

关翰
2023-03-14

比较器的compare()方法必须返回int,而您的方法似乎返回的是long。

您可以将其更改为:

(Message o1, Message o2)->Long.compare(o1.getTime(),o2.getTime())

这是假设(基于您的错误消息)是o1。getTime()返回一个长的。

印劲
2023-03-14

lambda可以看作是有点麻烦的匿名类的缩写:

Java8版本:

Collections.sort(list, (o1, o2) -> o1.getTime() - o2.getTime());

Java8前版本:

    Collections.sort(list, new Comparator<Message>() {
        @Override
        public int compare(Message o1, Message o2) {
            return o1.getTime() - o2.getTime();
        }
    }); 

所以,每次你对如何写一个正确的lambda感到困惑时,你可以试着写一个前lambda版本,看看它是怎么错的。

在您的特定问题中,您可以看到compare返回int,其中您的getTime返回long,这是错误的根源。

您可以使用任何一种方法作为其他回答方法,例如:

Long.compare(o1.getTime(),o2.getTime())
  • 您应该避免在比较器中使用-,这在某些情况下可能会导致溢出,并导致程序崩溃
彭鸿哲
2023-03-14

比较器#compareTo返回一个int;而getTime显然是long

这样写会更好:

.sort(Comparator.comparingLong(Message::getTime))
 类似资料:
  • 我有一个关于compareTo函数如何帮助比较器排序的问题,即o1。比较(o2)与o2。比较(o1) 如果两个字符串相等,则此方法返回0,否则返回正值或负值。如果第一个字符串在词典上大于第二个字符串,则结果为正,否则结果为负。 上面的陈述很简单,但是为什么o1.compare(o2)会给我一个升序,而o2.compare(o1)给了我一个降序? 如果我有整数值“5,10,3”,我得到3,5,10和

  • 假设我有一个双人课 我希望对它进行排序,首先是第一个值,然后是第二个值。现在,如果我这样做 一切都很好,列表按对的第一个值排序,但如果我这样做 它因错误而失败 好吧,所以它可能无法推断参数,所以如果我这样做 它因错误而失败 为什么它适用于comparing()而不适用于comparing()。然后比较()?

  • Snowpack Snowpack 也是一个与 Vite 十分类似的非构建式原生 ESM 开发服务器。除了不同的实现细节外,这两个项目在技术上比传统工具有很多共同优势。Vite 的依赖预绑定也受到了 Snowpack v1(现在是 esinstall)的启发。这两个项目之间的一些主要区别是: 生产构建 Snowpack 的默认构建输出是未打包的:它将每个文件转换为单独的构建模块,然后将这些模块提供

  • 比较两个输入的大小 用法 Your browser does not support the video tag. 案例:小台灯 功能:当随机数A>B时,灯亮;当随机数A<B时灯灭 工作原理 在配置面板中设置操作符(>,<,=),将两个数值连接到节点的输入端。如果满足比较条件,结果将输出YES。否则将输出NO。

  • 比较输入的数值与原来的数值。 用法 Your browser does not support the video tag. 案例:小闹钟 功能:今天15:00:00后,响起猫叫声小闹钟 工作原理 输入的值将用来被比较。如果这个值满足条件,那么这个节点将会输出“yes”;否则,输出“no”。 提示: 如果输入的是一个字符串,节点会尝试将它转化为数字;如果失败,将会输出“no” 如果输入的是一个对象

  • 我们已经学习了条件语句,但如果我们不能进行比较,if语句并不怎么有用。 当然Vim允许我们比较值的大小,只是不会像看上去那么一目了然。 执行下面的命令: :::vim :if 10 > 1 : echom "foo" :endif 显然,Vim会显示foo。现在执行下面的命令: :::vim :if 10 > 2001 : echom "bar" :endif Vim什么都不显示,

  • 问题内容: 假设我有一对班 我希望先按第一个值排序,然后再按第二个值排序。现在,如果我这样做 一切正常,列表按对的第一个值排序,但是如果我这样做 它因错误而失败 好的,所以它可能无法推断参数,所以如果我这样做 它因错误而失败 为什么它对compare()而不是compare()。thenComparing()有效? 问题答案: 该错误似乎与的通用参数有关。一种解决方法是尝试使用显式类型: 请注意,