gpt4 book ai didi

java - 仅当 allMatch 在 Java 中过滤和处理流时才收集流

转载 作者:行者123 更新时间:2023-11-29 06:50:32 25 4
gpt4 key购买 nike

我有以下流代码:

List<Data> results = items.stream()
.map(item -> requestDataForItem(item))
.filter(data -> data.isValid())
.collect(Collectors.toList());

Data requestDataForItem(Item item) {
// call another service here
}

问题是我想调用requestDataForItem 仅当流中的所有元素都有效时。例如,如果第一项无效,我不会调用流中的任何元素。

流API中有.allMatch,但它返回一个 boolean。我想做与 .allMatch 相同的事情.collect 一切匹配时的结果。另外,我只想处理一次流,有两个循环很容易。

这可以通过 Java Streams API 实现吗?

最佳答案

这将是 Java 9 的工作:

List<Data> results = items.stream()
.map(item -> requestDataForItem(item))
.takeWhile(data -> data.isValid())
.collect(Collectors.toList());

此操作将在第一个无效元素处停止。在顺序执行中,这意味着不会进行后续的 requestDataForItem 调用。在并行执行中,一些额外的元素可能会在操作停止之前并发处理,但这是高效并行处理的代价。

在任何一种情况下,结果列表将只包含第一个遇到无效元素之前的元素,您可以使用 results.size() == items.size() 轻松检查是否所有元素都是有效。


在 Java 8 中,没有这样简单的方法,考虑到非流式解决方案的简单性,使用额外的库或推出您自己的 takeWhile 实现不会带来返回

List<Data> results = new ArrayList<>();
for(Item item: items) {
Data data = requestDataForItem(item);
if(!data.isValid()) break;
results.add(data);
}

关于java - 仅当 allMatch 在 Java 中过滤和处理流时才收集流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49889452/

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