簡體   English   中英

Java 8 Map.Entry比較器

[英]Java 8 Map.Entry comparator

我一直在嘗試使用lambda表達式在Java8中創建Map.Entry Comparator ,並且發現了一種非常奇怪的行為。

Map<Integer, String> map = new TreeMap<>();

map.put(1, "Hello");
map.put(3, "zzzz");
map.put(2, "aaaa");
map.put(5, "AAAAA");
map.put(4, "aaaa");

Comparator<Map.Entry<Integer, String>> com = Comparator.comparing(Map.Entry::getValue);
com = com.reversed();

Comparator<Map.Entry<Integer, String>> com2 = Comparator.comparing(Map.Entry::getValue).reversed();

com工作正常,但com2包含一個錯誤的“ 無法解析方法getValue ”。 我真的不知道為什么? 有什么建議?

PS有沒有辦法避免用Integer,String鍵入Map.Entry 任何更短的方式?

從Java-8開始,有一個獨立的方法Entry.comparingByValue可以代替使用:

Comparator<Map.Entry<Integer, String>> com2 = 
        Map.Entry.<Integer, String>comparingByValue().reversed();

另一種方法是傳遞參數:

Comparator<Map.Entry<Integer, String>> com2 = 
        Map.Entry.comparingByValue(Comparator.reverseOrder());

這種方式類型參數是不必要的。

當前您在指定方法引用時指定原始類型 - 在第一種情況下,賦值的泛型類型推斷告訴編譯器您的意思,但這對方法調用的目標不起作用。 您可以指定方法引用的泛型類型:

Comparator<Map.Entry<Integer, String>> com2 = 
    Comparator.comparing(Map.Entry<Integer,String>::getValue).reversed();

(我知道這是增加你需要的次數Map.Entry<Integer, String>在你的代碼,但不幸的是這是難以避免的在這里。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM