[英]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::reverseOrder
是Comparator::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.