java布尔类型比较器_Java 8比较器类型推论非常困惑
我一直在研究Collections.sort和之間的區(qū)別list.sort,特別是在使用Comparator靜態(tài)方法以及l(fā)ambda表達(dá)式中是否需要參數(shù)類型方面。在開始之前,我知道我可以使用方法引用,例如Song::getTitle來解決我的問題,但是這里的查詢并不是我想要修復(fù)的東西,而是我想要答案的東西,即Java編譯器為什么以這種方式處理它。
這些是我的發(fā)現(xiàn)。假設(shè)我們有一個ArrayListtype Song,添加了一些歌曲,有3種標(biāo)準(zhǔn)的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") );
這是對兩種有效的排序方法的調(diào)用,沒問題:
Collections.sort(playlist1,
Comparator.comparing(p1 -> p1.getTitle()));
playlist1.sort(
Comparator.comparing(p1 -> p1.getTitle()));
一旦開始鏈接thenComparing,就會發(fā)生以下情況:
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())
);
即語法錯誤,因?yàn)樗辉僦李愋蚿1。因此,要解決此問題,我將類型添加Song到(比較)的第一個參數(shù)中:
現(xiàn)在是混淆部分。對于p laylist1.sort,即List,這可以解決以下兩個thenComparing調(diào)用的所有編譯錯誤。但是,對于Collections.sort,它將為第一個解決,而不是最后一個。我測試過添加了一些額外的調(diào)用thenComparing,除非我(Song p1)輸入了參數(shù),否則它總是顯示最后一個錯誤。
與中發(fā)生的情況相同,對于TreeSet,沒有編譯錯誤,但Objects.compare最后一次調(diào)用thenComparing顯示錯誤。
任何人都可以解釋一下為什么會發(fā)生這種情況,也可以解釋為什么(Song p1)在簡單地調(diào)用比較方法時根本不需要使用(無需進(jìn)一步thenComparing調(diào)用)。
關(guān)于同一主題的另一個查詢是我對以下內(nèi)容進(jìn)行查詢時TreeSet:
Set set = new TreeSet(
Comparator.comparing(p1 -> p1.getTitle())
.thenComparing(p1 -> p1.getDuration())
.thenComparing(p1 -> p1.getArtist())
);
例如,Song從用于比較方法調(diào)用的第一個lambda參數(shù)中刪除類型,它顯示在進(jìn)行比較的調(diào)用和對的第一個調(diào)用(thenComparing但對最終調(diào)用沒有)下的語法錯誤thenComparing-幾乎與上述情況相反!然而,所有其他3個例子,即有Objects.compare,List.sort而且Collections.sort當(dāng)我刪除第一個Song參數(shù)類型它顯示語法錯誤的所有電話。
提前謝謝了。
經(jīng)過編輯后包含了我在Eclipse Kepler SR2中收到的錯誤的屏幕截圖,此后我現(xiàn)在發(fā)現(xiàn)它們是特定于Eclipse的,因?yàn)樵诿钚猩鲜褂肑DK8 java編譯器進(jìn)行編譯時,它可以編譯。
總結(jié)
以上是生活随笔為你收集整理的java布尔类型比较器_Java 8比较器类型推论非常困惑的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php创建mysql计划任务_有关创建P
- 下一篇: 9宫格 java_java 拼接头像9宫