Java 带比较器的流排序方法

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可以工作,但是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);
//代码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)