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

标签 java collections foreach java-8 java-stream

当我想从迭代中获得多个结果时,如何使用流处理 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/

相关文章:

java - 初始化相互引用的静态字段时出错

java - Pax runner eclipse 插件更新站点

oracle - PLSQL Collections - 如何使用记录表?

C# "Generator"方法

javascript - 在 knockout 中递归调用 foreach

javascript - 如何使用Javascript计算数组中的相邻数字?

java - Java 是 "pass-by-reference"还是 "pass-by-value"?

java - 尝试显示所有可能的配料组合

laravel - 用新的格式化数组替换相关的模型集合数组

java - 对方法列表进行排序