簡體   English   中英

為什么Comparator.comparing不能與String :: toLowerCase方法引用一起使用?

[英]Why Comparator.comparing doesn't work with String::toLowerCase method reference?

我試圖通過反向順序(忽略大小寫)對字符串數組進行排序,而不進行修改,只打印它。 所以我使用的是Java8流。 但我無法做到這一點。

這是我的嘗試:

package experimentations.chapter02;

import java.util.Arrays;
import java.util.Comparator;
import java.util.stream.Collectors;

public class StringStream {

    public static void main(String[] args) {
        sortStrings();
    }

    public static void sortStrings(){
        String[] stringsArray = "The quick brown fox has a dirty ladder".split("\\s+");
        System.out.println(
                Arrays.stream(stringsArray)
                .sorted(Comparator.comparing(String::toLowerCase).reversed())
                .collect(Collectors.toList())
        );
    }

}

這里的問題是靜態方法Comparator.comparing不接受String::toLowerCase

同時,我設法對數組進行排序,但修改它:

public static void sortStrings(){
        String[] stringsArray = "The quick brown fox has a dirty ladder".split("\\s+");
        System.out.println(
                Arrays.stream(stringsArray)
                .map(String::toLowerCase)
                .sorted(Comparator.reverseOrder())
                .collect(Collectors.toList())
        );
}

那么,最簡​​單的解決方法是什么?

問題是,Java無法推導出某些復雜表達式的泛型類型。 第一個語句有效,而第二個語句導致編譯時錯誤:

Comparator<String> comparator = Comparator.comparing(String::toLowerCase);
Comparator<String> comparator = Comparator.comparing(String::toLowerCase).reversed();

有幾種方法可以解決這個問題。 以下是其中三個:

將中間比較器存儲在變量中:

Comparator<String> comparator = Comparator.comparing(String::toLowerCase);
System.out.println(
            Arrays.stream(stringsArray)
            .sorted(comparator.reversed())
            .collect(Collectors.toList()));

使用String.CASE_INSENSITIVE_ORDER

System.out.println(
            Arrays.stream(stringsArray)
            .sorted(String.CASE_INSENSITIVE_ORDER.reversed())
            .collect(Collectors.toList()));

添加顯式類型參數:

System.out.println(
            Arrays.stream(stringsArray)
            .sorted(Comparator.<String,String>comparing(String::toLowerCase).reversed())
            .collect(Collectors.toList()));

我找到了解決方案:

 .sorted((String e) -> e.toLowerCase) 

我認為語法問題

 .sorted(String::toLowerCase)

是編譯器然后期望將Object傳遞給String的實例方法toLowerCase。 所以我需要創建自己的lambda方法,而不忽略lambda參數(String)的類型,否則編譯器仍然無法解析它。

暫無
暫無

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

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