【问题标题】:Java Lambda Expression: incompatible types: bad return type in lambda expressionJava Lambda 表达式:不兼容的类型:lambda 表达式中的返回类型错误
【发布时间】:2018-10-09 23:33:13
【问题描述】:

我有以下工作列表,每个元素都是一个包含利润和难度的列表:

List<List<Integer>> jobs = new ArrayList<>();
for (int i = 0; i < difficulty.length; i++) {
    List<Integer> job = new ArrayList<Integer>();
    job.add(profit[i]);
    job.add(difficulty[i]);
    jobs.add(job);
}

现在我想根据利润(每个工作的第一个元素)对工作进行排序,如下所示:

jobs.sort((j1, j2) -> j1.get(0) > j2.get(0));

但出现以下错误:

error: incompatible types: bad return type in lambda expression

我做错了什么,我该如何解决?谢谢!

【问题讨论】:

  • 查看Comparator 的Javadoc。
  • 您应该返回一个整数而不是布尔值。

标签: java sorting lambda collections java-8


【解决方案1】:

我会回答这个问题,因为在我的情况下,问题出在 JDK 上

我正在使用 JDK 1.8.56 编译 bad return type,所以我更新到 1.8.211 并且问题已经消失了。

【讨论】:

    【解决方案2】:

    问题出在下面一行

    jobs.sort((j1, j2) -> j1.get(0) > j2.get(0));
    

    是您没有遵循排序方法的签名:

    default void sort(Comparator<? super E> c)
    

    当您将比较器实现为 lambda 时,您应该传递返回 int 而不是 boolean 的 lambda。

    在你的情况下应该是这样的:

    jobs.sort((j1, j2) -> compare two lists somehow to return int);
    

    或使用@Aominè 提供的 sn-p

    【讨论】:

      【解决方案3】:

      您的comparator 无效,因为它返回boolean,而预期的返回类型是int

      一个简单的解决方案是:

      jobs.sort(Comparator.comparing(e -> e.get(0)));
      

      或:

      jobs.sort((j1, j2) -> Integer.compare(j1.get(0), j2.get(0)));
      

      【讨论】:

      • 或者在这个具体的例子中,jobs.sort(Comparator.comparingInt(...));
      • 谢谢!我做了一些修改并更喜欢:jobs.sort((j1, j2) -> j1.get(0) - j2.get(0));
      猜你喜欢
      • 1970-01-01
      • 2021-11-01
      • 1970-01-01
      • 2015-07-22
      • 1970-01-01
      • 1970-01-01
      • 2014-08-06
      • 1970-01-01
      相关资源
      最近更新 更多