簡體   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