java - 迭代集合时 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
?
解决方案
其他答案略有不同,使用过滤器每 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(...);
推荐阅读
- javascript - React Hook useEffect/useCallback 缺少依赖项
- swiftui - 工作表中的 TabView:“同时访问...,但修改需要独占访问”
- google-chrome-extension - Chrome 扩展开发访问网络选项卡
- git - 通过合并获取分支的历史记录
- entity-framework - i:nill="true" 出现在响应中
- macos - 为什么这个简单的自动布局在 IB 中崩溃了?
- javascript - 为什么第一个等待会被忽略?
- node.js - node.js 加密中的长度密钥或 iv 无效
- java - 当我自定义高度和自定义背景时,为什么按钮文本不是 wrap_content 并且消失了?
- android - android中的多个通知声音