![](/img/trans.png)
[英]in java, use String::length for Comparator.comparing()
[英]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.