Java 带比较器的流排序方法
我不明白为什么code1可以工作,但是code2不能编译。请解释一下Java 带比较器的流排序方法,java,java-stream,method-reference,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.sorte
//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);
//代码1:
流s=流(“AA”、“BB”);
s、 排序(Comparator.reverseOrder())
.forEach(系统输出::打印);
//代码2:
流s=流(“AA”、“BB”);
s、 已排序(比较器::反向排序)
.forEach(系统输出::打印);
两者之间的区别是code1使用
Comparator.reverseOrder()
,而code2使用Comparator::reverseOrder
,因为第一个示例是工厂方法
,所以当您检查它时,您会看到您得到了一个比较器
但是第二个是方法参考
,您可以这样写:
Stream<String> s = Stream.of("AA", "BB");
s.sorted(() -> Comparator.reverseOrder()) // no semantic difference!
.forEach(System.out::print);
来自编译器的错误消息应该告诉您
sorted()
需要一个比较器实例<代码>比较器。reverseOrder()返回比较器实例。这样就行了
Comparator::reverseOrder
是对Comparator的reverseOrder()方法的方法引用。因此,您的代码基本上是这样的:每次需要比较两个字符串时,将它们作为参数传递给Comparator.reverseOrder
,以比较它们。但这不可能奏效。此方法不接受任何内容作为参数,并返回一个比较器。因此它与比较器的签名不匹配,比较器应该以两个字符串作为参数,并返回一个整数
如果你有这样的方法
class Foo
public static int compareStrings(String s1, String s2) {
...
}
}
那你可以用
sorted((s1, s2) -> Foo.compareStrings(s1, s2))
您可以使用方法引用将其转换为
sorted(Foo::compareStrings)
因为compareStrings就像Comparator
的唯一抽象方法一样,将两个字符串作为参数并返回一个int
sorted(Foo::compareStrings)