alw*_*ous 2 java java-stream method-reference
我不明白为什么code1工作但code2不编译.请解释.
//Code1:
Stream<String> s = Stream.of("AA", "BB");
s.sorted(Comparator.reverseOrder())
.forEach(System.out::print);
//Code2:
Stream<String> s = Stream.of("AA", "BB");
s.sorted(Comparator::reverseOrder)
.forEach(System.out::print);
Run Code Online (Sandbox Code Playgroud)
两者之间的区别是code2使用Comparator.reverseOrder()时code1使用Comparator::reverseOrder
因为第一个例子是factory-method当你检查它时,你看到你得到一个比较器.
但第二个是method-reference你可以这样写的:
Stream<String> s = Stream.of("AA", "BB");
s.sorted(() -> Comparator.reverseOrder()) // no semantic difference!
.forEach(System.out::print);
Run Code Online (Sandbox Code Playgroud)
但它有一个完全不同的含义,因为这次给你Stream#sorted()一个Supplier<Comparator<?>>但它只需要一个Comparator<?>
小旁注:不要将流存储在变量中,直接使用它们.所以我建议你写一下:
Stream.of("AA", "BB")
.sorted(Comparator.reverseOrder())
.forEach(System.out::print);
Run Code Online (Sandbox Code Playgroud)
来自编译器的错误消息应该告诉您.
sorted()期待一个Comparator实例.Comparator.reverseOrder()返回Comparator实例.所以这很好.
Comparator::reverseOrder是Comparator的reverseOrder()方法的方法引用.所以你的代码基本上说:每次你需要比较两个字符串时,将它们作为参数传递给它们Comparator.reverseOrder来比较它们.但那不可能奏效.此方法不作为参数,并返回Comparator.所以它与a的签名不匹配Comparator<String>,它应该以两个字符串作为参数,并返回一个整数.
如果你有一个方法,如
class Foo
public static int compareStrings(String s1, String s2) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以使用
sorted((s1, s2) -> Foo.compareStrings(s1, s2))
Run Code Online (Sandbox Code Playgroud)
您可以使用方法引用转换为
sorted(Foo::compareStrings)
Run Code Online (Sandbox Code Playgroud)
因为compareStrings就像独特的抽象方法一样Comparator<String>,将两个字符串作为参数并返回一个int.
| 归档时间: |
|
| 查看次数: |
1294 次 |
| 最近记录: |