lol*_*f64 10 java comparator java-8 java-stream 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())
);
}
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是String::toLowerCase
静态方法不接受Comparator.comparing
.
同时,我设法对数组进行排序,但修改它:
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())
);
}
Run Code Online (Sandbox Code Playgroud)
那么,最简单的解决方法是什么?
nos*_*sid 24
问题是,Java无法推导出某些复杂表达式的泛型类型.第一个语句有效,而第二个语句导致编译时错误:
Comparator<String> comparator = Comparator.comparing(String::toLowerCase);
Comparator<String> comparator = Comparator.comparing(String::toLowerCase).reversed();
Run Code Online (Sandbox Code Playgroud)
有几种方法可以解决这个问题.以下是其中三个:
将中间比较器存储在变量中:
Comparator<String> comparator = Comparator.comparing(String::toLowerCase);
System.out.println(
Arrays.stream(stringsArray)
.sorted(comparator.reversed())
.collect(Collectors.toList()));
Run Code Online (Sandbox Code Playgroud)
用途String.CASE_INSENSITIVE_ORDER
:
System.out.println(
Arrays.stream(stringsArray)
.sorted(String.CASE_INSENSITIVE_ORDER.reversed())
.collect(Collectors.toList()));
Run Code Online (Sandbox Code Playgroud)
添加显式类型参数:
System.out.println(
Arrays.stream(stringsArray)
.sorted(Comparator.<String,String>comparing(String::toLowerCase).reversed())
.collect(Collectors.toList()));
Run Code Online (Sandbox Code Playgroud)
我找到了解决方案:
.sorted((String e) -> e.toLowerCase)
Run Code Online (Sandbox Code Playgroud)
我认为语法问题
.sorted(String::toLowerCase)
Run Code Online (Sandbox Code Playgroud)
是编译器然后期望将Object传递给String的实例方法toLowerCase.所以我需要创建自己的lambda方法,而不忽略lambda参数(String)的类型,否则编译器仍然无法解析它.
归档时间: |
|
查看次数: |
13192 次 |
最近记录: |