Stream 的 max 函数可以方便地识别流中的最大值。然而,它遵循“先到先得”的原则,如果存在平局,可能会忽略其他最大值。为了解决此限制并检索所有最大值,需要替代方法。
对于输入集合,可以采用两遍方法:
此解决方案可容纳多个最大值,但会产生对整个输入进行两次迭代的成本。
当输入是流中,可以使用单通道收集器:
static <T> Collector<T, ?, List<T>> maxList(Comparator<? super T> comp) { return Collector.of( ArrayList::new, (list, t) -> { if (list.isEmpty() || comp.compare(t, list.get(0)) == 0) { list.add(t); } else if (comp.compare(t, list.get(0)) > 0) { list.clear(); list.add(t); } }, (list1, list2) -> { ... // Compare and merge lists based on maximum values } ); }
该收集器维护以下不变式:等价,根据需要添加或删除元素。合并列表时,它会考虑每个列表中的最大元素,并在相等时将它们合并。
通过将此收集器与流相结合,可以在一次传递中获得所有最大值。
虽然 Java 流中的 max 有其局限性,但可以利用替代解决方案来克服它们。两遍解决方案对于收集来说是高效的,而单遍收集器对于流来说非常有用,允许检索所有最大值。
以上是如何从 Java 流中检索所有最大值并有效处理关系?的详细内容。更多信息请关注PHP中文网其他相关文章!