2017-03-09 65 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