首页 > 解决方案 > 迭代集合时 Java 流/forEach 中的定期操作

问题描述

在过去的 Java 中,我们可以循环一个集合,每个X项目都执行特定的操作 - 例如,将大量项目保存到 DB:

所以给定

List students = ....;

我们可以做一些周期性的动作——比如:

for(int i = 0; i < students.size(); i++){
    methodA(students.get(i));
    methodB(students.get(i));

    if (i % 100 == 0){
        flushToDB(...);
        reportProgressToSlack(...);
        ....
    }
}

当尝试使用我们做类似的事情时,Streams我们得到一个错误:

int counter = 0;
students.stream().forEach(student -> {
    methodA(student);
    methodB(student);
    counter++;
});

但当然,编译器抱怨counter它必须是最终的或有效的最终。

有没有办法使用 java 做这样的事情Streams

标签: javaloopsjava-stream

解决方案


其他答案略有不同,使用过滤器每 100 个条目通过。首先通过流式传输列表索引:

IntStream.range(0, students.size()).filter(i -> {
    Student student = students.get(i);
    methodA(student);
    methodB(student);
    return i % 100 == 0;
}).forEach(...);

其次,通过流式传输和跟踪累积索引:

AtomicInteger i = new AtomicInteger();
students.stream().filter(student -> {
    methodA(student);
    methodB(student);
    return i.getAndIncrement() % 100 == 0;
}).forEach(...);


推荐阅读