gpt4 book ai didi

java - 管理具有多个结果的 Java 8 流的最佳实践是什么

转载 作者:行者123 更新时间:2023-12-02 10:58:50 25 4
gpt4 key购买 nike

当我想从迭代中获得多个结果时,如何使用流处理 Java 8 中的 forEach。当然,在流 forEach 操作中调用 List.add 方法不是一个选项...您将如何使用 Java 8 流重写此代码?

additionalWebsitesList = Lists.newArrayList();
String additionalWebistesCsv = "";
for (String website : additionalWebsites) {
WebsiteModel websiteModel = getWebsiteModel(website);

//How this can be processed via Stream???
additionalWebsitesList.add(websiteModel);
areaModels.addAll(websiteModel.getAreas());
additionalWebistesCsv += websiteModel.getId();
}

最佳答案

使用流执行此类操作的方法是使用自定义收集器。假设我们定义以下类:

public class Results {
private final List<WebsiteModel> additionalWebsitesList = new ArrayList<>();
private final List<AreaModel> areaModels = new ArrayList<>();
private final StringBuilder additionalWebsitesCsv = new StringBuilder();

public void accumulate(WebsiteModel websiteModel) {
additionalWebsitesList.add(websiteModel);
areaModels.addAll(websiteModel.getAreas());
additionalWebsitesCsv.append(websiteModel.getId());
}

public void combine(Results another) {
additionalWebsitesList.addAll(another.additionalWebsitesList);
areaModels.addAll(another.areaModels);
additionalWebsitesCsv.append(another.additionalWebsitesCsv);
}

public List<WebsiteModel> getAdditionalWebsitesList() {
return additionalWebsitesList;
}

public List<AreaModel> getAreaModels() {
return areaModels;
}

public String getAdditionalWebsitesCsv() {
return additionalWebsitesCsv.toString();
}
}

有了这个 Results 类,您就可以收集结果了:

Results results = additionalWebsites.stream()
.map(this::getWebsiteModel)
.collect(Results::new, Results::accumulate, Results::combine);

这使用 Stream.collect方法。第一个参数是一个 Supplier,它创建可变对象,流的元素将通过第二个参数中提供的累加器累积到该对象中。第三个参数是合并,如果流是并行的,则仅用于合并部分结果。

关于java - 管理具有多个结果的 Java 8 流的最佳实践是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48967083/

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