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