【问题标题】:Easiest sortig of list of objects with java 8 lambda使用 java 8 lambda 对对象列表进行最简单的排序
【发布时间】:2017-07-30 08:13:25
【问题描述】:

我有一个包含对象的列表,我正在寻找按 java 8 对该列表进行排序的最简单方法:

public class MyClass {
    private Integer someInteger;
    private String someString;
}

private List<MyClass> myClasses;

在这个问题上,我已经尝试过java 8的答案:

Collections.sort(myClasses, (MyClass m1, MyClass m2) -> m1.someInteger.compareTo(m2.someInteger));

但我的 Eclipse 正在大喊:

The method sort(List<T>, Comparator<? super T>) in the type
Collections is not applicable for the arguments (List<MyClass>,
(MyClass m1, MyClass m2) -> {})

和:

Type mismatch: cannot convert from Comparator<MyClass> to Comparator<? super T>

我还找到了另一个例子:

myClasses.sort(Comparator.comparing(MyClasse::getSomeInteger));

但也有错误:

The method sort(Comparator<? super MyClass>) in the type List<MyClass>
is not applicable for the arguments (Comparator<MyClass>)

那么我怎样才能以最简单的方式做到这一点呢?

【问题讨论】:

  • 到底是什么问题?你不能比较对象吗?
  • 最简单的方法是尊重“信息隐藏”原则并让你的类实现Comparable。第二种最简单的方法是通过 getters 而不是直接使用来访问类属性。
  • 第一次尝试Collections.sort。我看不出这是怎么可能的,因为someInteger 是私有的,因此无法使用m1.someInteger 访问它。另请查看this 了解确切的语法
  • @Timothy Truckle:由于基于两个属性之一的订单不是自然,因此该类不应实现Comparable,而是提供预构建的Comparators for属性,例如作为静态字段,static final Comparator&lt;MyClass&gt; BY_SOME_INTEGER = Comparator.comparingInt(o -&gt; o.someInteger), BY_SOME_STRING = Comparator.comparing(o -&gt; o.someString);...
  • @Timothy Truckle:没错,这就是为什么建议是实施Comparable。基于属性的比较器根据属性进行排序永远不会出错,但是使用忽略至少一个属性的逻辑来实现Comparable 可能是错误的(通常是错误的)。你也可以反过来看:如果 victorio 认为这是自然顺序,那么他的类已经实现了 Comparable...

标签: java sorting lambda java-8 comparator


【解决方案1】:

编译器错误在这里有点误导。在这种情况下,它只是告诉您您的 lambda 表达式无法编译。具体来说,因为您尝试从 MyClass 外部访问私有字段。

例如这一行:

Collections.sort(myClasses, (MyClass m1, MyClass m2) -> m1.nonExistingField);

会产生同样的错误:

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
    The method sort(List<T>, Comparator<? super T>) in the type Collections is not applicable for the arguments (List<MyClass>, (MyClass m1, MyClass m2) -> {})
    Comparator<MyClass> cannot be resolved to a type
    MyClass cannot be resolved to a type
    MyClass cannot be resolved to a type

    at ap.MyClass.main(MyClass.java:11)

【讨论】:

  • 谢谢!如我所见,它也适用于 Collections.sort(myClasses, (MyClass m1, MyClass m2) -> m1.getSomeInteger().compareTo(m2.getSomeInteger())); 和 Collections.sort(myClasses, (MyClass m1, MyClass m2) -> m1.getSomeInteger());。是吗?
  • 哦不,它不是大喊大叫,因为它是一个整数,并且 compareTo 也作为整数返回。对不起!
猜你喜欢
  • 2010-10-17
  • 1970-01-01
  • 2014-07-05
  • 2018-10-20
  • 1970-01-01
  • 1970-01-01
  • 2019-09-05
  • 2021-02-06
相关资源
最近更新 更多