带比较器的流排序方法
Stream sorted method with comparator
我不明白为什么 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);
两者的区别在于code1使用Comparator.reverseOrder()
而code2使用Comparator::reverseOrder
因为第一个例子是 factory-method
所以当你检查它时,你会发现你得到了一个比较器。
但是第二个是 method-reference
你可以这样写:
Stream<String> s = Stream.of("AA", "BB");
s.sorted(() -> Comparator.reverseOrder()) // no semantic difference!
.forEach(System.out::print);
但它有一个完全不同的含义,因为这次给你 Stream#sorted()
一个 Supplier<Comparator<?>>
但它只需要一个 Comparator<?>
小旁注:不要将流存储在变量中,直接使用它们。所以我建议你只写:
Stream.of("AA", "BB")
.sorted(Comparator.reverseOrder())
.forEach(System.out::print);
编译器的错误消息应该会告诉您这一点。
sorted()
需要一个 Comparator 实例。 Comparator.reverseOrder()
returns 一个 Comparator 实例。这样就可以正常工作了。
Comparator::reverseOrder
是对Comparator的reverseOrder()方法的方法引用。所以你的代码基本上说:每次你需要比较两个字符串时,将它们作为参数传递给 Comparator.reverseOrder
来比较它们。但这不可能行得通。此方法不接受任何参数,return 是一个比较器。所以它不匹配 Comparator<String>
的签名,它应该接受两个字符串作为参数,return 一个整数。
如果你有
这样的方法
class Foo
public static int compareStrings(String s1, String s2) {
...
}
}
那么你可以使用
sorted((s1, s2) -> Foo.compareStrings(s1, s2))
您可以使用方法参考将其转换为
sorted(Foo::compareStrings)
因为compareStrings,就像Comparator<String>
独特的抽象方法一样,接受两个String作为参数,return是一个int。
我不明白为什么 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);
两者的区别在于code1使用Comparator.reverseOrder()
而code2使用Comparator::reverseOrder
因为第一个例子是 factory-method
所以当你检查它时,你会发现你得到了一个比较器。
但是第二个是 method-reference
你可以这样写:
Stream<String> s = Stream.of("AA", "BB");
s.sorted(() -> Comparator.reverseOrder()) // no semantic difference!
.forEach(System.out::print);
但它有一个完全不同的含义,因为这次给你 Stream#sorted()
一个 Supplier<Comparator<?>>
但它只需要一个 Comparator<?>
小旁注:不要将流存储在变量中,直接使用它们。所以我建议你只写:
Stream.of("AA", "BB")
.sorted(Comparator.reverseOrder())
.forEach(System.out::print);
编译器的错误消息应该会告诉您这一点。
sorted()
需要一个 Comparator 实例。 Comparator.reverseOrder()
returns 一个 Comparator 实例。这样就可以正常工作了。
Comparator::reverseOrder
是对Comparator的reverseOrder()方法的方法引用。所以你的代码基本上说:每次你需要比较两个字符串时,将它们作为参数传递给 Comparator.reverseOrder
来比较它们。但这不可能行得通。此方法不接受任何参数,return 是一个比较器。所以它不匹配 Comparator<String>
的签名,它应该接受两个字符串作为参数,return 一个整数。
如果你有
这样的方法class Foo
public static int compareStrings(String s1, String s2) {
...
}
}
那么你可以使用
sorted((s1, s2) -> Foo.compareStrings(s1, s2))
您可以使用方法参考将其转换为
sorted(Foo::compareStrings)
因为compareStrings,就像Comparator<String>
独特的抽象方法一样,接受两个String作为参数,return是一个int。