【发布时间】: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<MyClass> BY_SOME_INTEGER = Comparator.comparingInt(o -> o.someInteger), BY_SOME_STRING = Comparator.comparing(o -> o.someString);... -
@Timothy Truckle:没错,这就是为什么建议不是实施
Comparable。基于属性的比较器根据属性进行排序永远不会出错,但是使用忽略至少一个属性的逻辑来实现Comparable可能是错误的(通常是错误的)。你也可以反过来看:如果 victorio 认为这是自然顺序,那么他的类已经实现了Comparable...
标签: java sorting lambda java-8 comparator