首頁 > Java > java教程 > 如何從 Java 流中取得所有最大值?

如何從 Java 流中取得所有最大值?

Linda Hamilton
發布: 2024-12-08 13:33:11
原創
619 人瀏覽過

How to Get All Maximum Values from a Java Stream?

如何在Java Stream 中傳回多個最大值

在Java Stream API 中,max 函數通常會傳回以下值中的最大元素之一提供比較器時的集合。但是,如果我們想要所有最大值,特別是當多個元素具有相同的最大值時,該怎麼辦?

傳回所有最大值的技巧

不幸的是,Java API 不這樣做不提供檢索所有最大值的直接方法。但是,解決方法是使用收集器儲存部分結果。這是一個基於比較器產生收集器的輔助函數:

static <T> Collector<T, ?, List<T>> maxList(Comparator<? super T> comp) {
    return Collector.of(
        ArrayList::new,
        (list, t) -> {
            int c;
            if (list.isEmpty() || (c = comp.compare(t, list.get(0))) == 0) {
                list.add(t);
            } else if (c > 0) {
                list.clear();
                list.add(t);
            }
        },
        (list1, list2) -> {
            if (list1.isEmpty()) {
                return list2;
            } 
            if (list2.isEmpty()) {
                return list1;
            }
            int r = comp.compare(list1.get(0), list2.get(0));
            if (r < 0) {
                return list2;
            } else if (r > 0) {
                return list1;
            } else {
                list1.addAll(list2);
                return list1;
            }
        });
}
登入後複製

此收集器維護一個與比較器等效的元素清單。合併結果時,收集器傳回包含較大元素的清單。如果元素相等,則會附加清單。

要在流上使用此收集器,只需如下應用它:

Stream<String> input = ... ;

List<String> result = input.collect(maxList(comparing(String::length)));
登入後複製

範例用法

例如,讓我們尋找a 中具有最大長度的所有字串清單。

List<String> strings = Arrays.asList("apple", "banana", "pear", "orange", "grapes", "kiwi");

Stream<String> stringStream = strings.stream();

List<String> maxStrings = stringStream.collect(maxList(Comparator.comparingInt(String::length)));

System.out.println(maxStrings); // [apple, banana, grapes, orange]
登入後複製

在此範例中,maxList 收集器將傳回一個包含所有具有最大長度的字串的清單。

以上是如何從 Java 流中取得所有最大值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板