java布尔类型比较器_Java 8比较器类型推论非常困惑
我一直在研究Collections.sort和之間的區別list.sort,特別是在使用Comparator靜態方法以及lambda表達式中是否需要參數類型方面。在開始之前,我知道我可以使用方法引用,例如Song::getTitle來解決我的問題,但是這里的查詢并不是我想要修復的東西,而是我想要答案的東西,即Java編譯器為什么以這種方式處理它。
這些是我的發現。假設我們有一個ArrayListtype Song,添加了一些歌曲,有3種標準的get方法:
ArrayList playlist1 = new ArrayList();
//add some new Song objects
playlist.addSong( new Song("Only Girl (In The World)", 235, "Rhianna") );
playlist.addSong( new Song("Thinking of Me", 206, "Olly Murs") );
playlist.addSong( new Song("Raise Your Glass", 202,"P!nk") );
這是對兩種有效的排序方法的調用,沒問題:
Collections.sort(playlist1,
Comparator.comparing(p1 -> p1.getTitle()));
playlist1.sort(
Comparator.comparing(p1 -> p1.getTitle()));
一旦開始鏈接thenComparing,就會發生以下情況:
Collections.sort(playlist1,
Comparator.comparing(p1 -> p1.getTitle())
.thenComparing(p1 -> p1.getDuration())
.thenComparing(p1 -> p1.getArtist())
);
playlist1.sort(
Comparator.comparing(p1 -> p1.getTitle())
.thenComparing(p1 -> p1.getDuration())
.thenComparing(p1 -> p1.getArtist())
);
即語法錯誤,因為它不再知道類型p1。因此,要解決此問題,我將類型添加Song到(比較)的第一個參數中:
現在是混淆部分。對于p laylist1.sort,即List,這可以解決以下兩個thenComparing調用的所有編譯錯誤。但是,對于Collections.sort,它將為第一個解決,而不是最后一個。我測試過添加了一些額外的調用thenComparing,除非我(Song p1)輸入了參數,否則它總是顯示最后一個錯誤。
與中發生的情況相同,對于TreeSet,沒有編譯錯誤,但Objects.compare最后一次調用thenComparing顯示錯誤。
任何人都可以解釋一下為什么會發生這種情況,也可以解釋為什么(Song p1)在簡單地調用比較方法時根本不需要使用(無需進一步thenComparing調用)。
關于同一主題的另一個查詢是我對以下內容進行查詢時TreeSet:
Set set = new TreeSet(
Comparator.comparing(p1 -> p1.getTitle())
.thenComparing(p1 -> p1.getDuration())
.thenComparing(p1 -> p1.getArtist())
);
例如,Song從用于比較方法調用的第一個lambda參數中刪除類型,它顯示在進行比較的調用和對的第一個調用(thenComparing但對最終調用沒有)下的語法錯誤thenComparing-幾乎與上述情況相反!然而,所有其他3個例子,即有Objects.compare,List.sort而且Collections.sort當我刪除第一個Song參數類型它顯示語法錯誤的所有電話。
提前謝謝了。
經過編輯后包含了我在Eclipse Kepler SR2中收到的錯誤的屏幕截圖,此后我現在發現它們是特定于Eclipse的,因為在命令行上使用JDK8 java編譯器進行編譯時,它可以編譯。
總結
以上是生活随笔為你收集整理的java布尔类型比较器_Java 8比较器类型推论非常困惑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php创建mysql计划任务_有关创建P
- 下一篇: 9宫格 java_java 拼接头像9宫