繁体   English   中英

使用比较器对流排序的方法

[英]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()返回Comparator实例。 所以这很好。

Comparator::reverseOrderComparator::reverseOrder的reverseOrder()方法的方法引用。 所以你的代码基本上说:每次你需要比较两个字符串时,将它们作为参数传递给Comparator.reverseOrder来比较它们。 但那不可能奏效。 此方法不作为参数,并返回Comparator。 因此它与Comparator<String>的签名不匹配,后者应该将两个Strings作为参数,并返回一个整数。

如果你有一个方法,如

class Foo
    public static int compareStrings(String s1, String s2) {
        ...
    }
}

然后你可以使用

sorted((s1, s2) -> Foo.compareStrings(s1, s2))

您可以使用方法引用转换为

sorted(Foo::compareStrings)

因为compareStrings,就像Comparator<String>的唯一抽象方法一样,将两个字符串作为参数并返回一个int。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM