gpt4 book ai didi

Java 流 : use optional filter() operations on chaining

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:46:42 25 4
gpt4 key购买 nike

注意:此问题与java.util.Optional相关。

在处理流时,我经常使用这样的逻辑:

 Stream<FooBar> stream = myInitialStream();
if (needsFilter1) stream = stream.filter(c -> whatever1());
if (needsFilter2) stream = stream.filter(c -> whatever2());
...
return stream.collect(toList());

我想要实现的是使用链接将上面的代码转换为单个表达式。我发现这更具可读性和直接性。到目前为止,我发现实现这一目标的唯一方法是:

return myInitialStream()
.filter(needsFilter1? c->whatever1() : c->true)
.filter(needsFilter2? c->whatever2() : c->true)
.collect(toList());

不过,这会对那些琐碎的 c->true lamda 进行不必要的调用,这可能会在扩展时产生一些性能成本。

所以我的问题是:是否有更好的方法来生成包含可选过滤的链式流表达式?

更新:也许我说得不够清楚,但我的问题的重点是找到一个单表达式解决方案。如果我必须使用多个语句(例如初始化一个谓词),我也可以使用我的问题的第一个代码块,它基本上做同样的事情。

最佳答案

使用 Predicate::and 根据条件链接谓词返回一个新的谓词。

Predicate<FooBar> predicate = c -> whatever();

if (condition1) { predicate = predicate.and(c -> whatever1()); }
if (condition2) { predicate = predicate.and(c -> whatever2()); }

List<FooBar> dest = list.stream()
.filter(predicate)
.collect(Collectors.toList());

更新请求单个表达式。无论如何,您需要一个映射条件到谓词的来源。用数据结构Map<Supplier<Boolean>, Predicate<Integer>> ,其中一个键是 Supplier决定是否使用值 ( Predicate<FooBar> ) 的条件。

将 map 的条目减少到新的 Predicate<FooBar>使用链接这些 Predicates Predicate::and ,为此他们的 Supplier<Boolean>返回 true (条件成立)。

有一个 Map条件:

Map<Supplier<Boolean>, Predicate<FooBar>> map = new HashMap<>();
map.put(() -> needsFilter1, c -> whatever1());
map.put(() -> needsFilter2, c -> whatever2());
...

这是一个 Stream声明:

List<Integer> dest = list
.stream()
.filter(map.entrySet() // filter with a predicate ...
.stream()
.filter(e -> e.getKey().get()) // .. where a condition is 'true'
.map(Entry::getValue) // .. get Predicates
.reduce(i -> true, (l, r) -> l.and(r))) // .. reduce them using AND
.collect(Collectors.toList());

关于Java 流 : use optional filter() operations on chaining,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54093751/

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