在 Java 流中使用 Max 函数返回所有最大值
在 Java 8 的 lambda 流中使用 max 函数时,在场景中可能会出现差异其中多个对象产生相同的最大值。该函数输出任意代表,而不评估或考虑所有可行的候选者。
为了解决此限制,需要一种替代方法来准确检索所有最大值。不幸的是,没有一种简单的方法,需要利用集合来保存部分结果。
两遍解决方案
对于存储在集合中的输入(List list),可以采用两阶段过程:
单通道解决方案(流)
要使用流解决单通道场景,可以根据提供的比较器构建自定义收集器:
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) -> { // Processing for list merging logic } ); }
要在流中使用此收集器,只需调用收集:
Stream<String> input = ... ; List<String> result = input.collect(maxList(comparing(String::length)));
以上是如何使用'max”函数从 Java 流返回所有最大值?的详细内容。更多信息请关注PHP中文网其他相关文章!