Java 8 Lambda:比较器

新手上路,请多包涵

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

原文由 Nunyet de Can Calçada 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 864
2 个回答

Comparator#compareTo 返回一个 int ;而 getTime 显然是 long

这样写会更好:

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

原文由 Eugene 发布,翻译遵循 CC BY-SA 4.0 许可协议

拉姆达

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 感到困惑时,你可以尝试编写一个 pre-lambda 版本,看看它是怎么错的。

应用

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

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

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

注意

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

原文由 Tony 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题