Java 8 Lambda: Comparator

2022-08-31 19:41:56

我想使用 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) 
     -> {})

答案 1

Comparator#compareTo返回一个 ;虽然很明显。intgetTimelong

这样写会更好:

.sort(Comparator.comparingLong(Message::getTime))

答案 2

Lambda

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之前的版本,看看它是如何错误的。

应用

在您的特定问题中,您可以看到 退货 ,其中您的退货时间很长,这是错误的根源。compareintgetTime

您可以将任一方法用作其他答案方法,例如:

Long.compare(o1.getTime(),o2.getTime())

通知

  • 在某些情况下,应避免使用 in,这可能会导致溢出,并使程序崩溃。-Comparator

推荐