如何在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中文網其他相關文章!