gpt4 book ai didi

java - 在 Java 中优先考虑流过滤器函数

转载 作者:行者123 更新时间:2023-12-01 14:07:58 25 4
gpt4 key购买 nike

我正在寻找一种过滤插播但使用优先级的选项。

以下是伪代码:

results.stream().filter(prio1).ifNotFound(filter(prio2)).collect(toList())

结果列表应由名为“prio1”的第一个标准过滤,如果未找到匹配项,则应应用第二个过滤器尝试过滤名为 prio2 的第二个标准 然后收集结果

如何在 Java 8 中使用流实现这一点?

我正在寻找流中的单线。

最佳答案

您需要将结果 stream() 两次,但以下内容应作为单行:

results.stream().filter(results.stream().anyMatch(prio1) ? prio1 : prio2).collect(Collectors.toList());

(感谢 flakes 首次使用类似策略发布多行。)

编辑:由于一些优秀的新答案已经浮出水面,我想我会为这种多流/anyMatch 策略提供一个简短的辩护,并引用某些其他策略本帖部分内容:

  • As pointed out by eckes , anyMatch 被优化为提前返回,因此花费最少的时间读取额外的流(特别是对于 prio1 可能匹配的情况)。实际上,anyMatch 只会在后备 (prio2) 的情况下读取整个流,因此对于平均运行,您只需遍历 one-and-a-fraction 列表长度。

  • 使用 Collectors.groupingBy(...) 方法在每种情况下都会构造一个 Map 和两个 List,而上面的方法最多只能创建一个 List。随着 results 大小的增加,这里的内存开销差异将变得非常显着。分组是针对整个流完成的,所以即使第一个元素恰好通过 prio1,每个元素也必须对照 prio1.or(prio2) 然后再次针对 prio1

  • groupingBy 不考虑 prio1prio2 不互斥的情况。如果 prio2.test(e) 可以为某些通过 prio1e 返回 true,则此类元素将丢失在备用 prio2 列表中。一次使用 anyMatch 和一个过滤器可以避免这个问题。

  • 上述方法的行长和复杂性对我来说似乎更易于管理。

关于java - 在 Java 中优先考虑流过滤器函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43552040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com