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