2017-03-09 82 views
2

我有对象的列表,以及对象名单,sortig我正在寻找最简单的方法来排序的Java 8中列表:最简单的用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>) 

所以,我怎么能做到这一点的最简单的方法?

+0

什么问题是什么呢?你无法比较对象吗? – user218046

+3

最简单的就是尊重“信息隐藏”原则,让你的班级实施“可比”。第二种最简单的方法是通过* getters *访问类属性,而不是直接使用。 –

+2

第一次尝试'Collections.sort'。我看不出这是如何实现的,因为'someInteger'是私有的,因此无法使用'm1.someInteger'来访问它。也可以看看[this](https://www.mkyong.com/java8/java-8-lambda-comparator-example/)的确切语法 –

回答

3

编译器错误在这里有点误导。在这种情况下,它只是告诉你,你的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) 
+0

谢谢!正如我所看到的,它也与** Collections.sort(myClasses,(MyClass m1,MyClass m2) - > m1.getSomeInteger()。compareTo(m2.getSomeInteger())); **和** Collections一起工作。 sort(myClasses,(MyClass m1,MyClass m2) - > m1.getSomeInteger()); **。真正? – victorio

+0

哦,不,它并不是因为它是一个整数而大叫,而且compareTo也以Integer的形式返回。抱歉! – victorio