其中 parallelStream() 为多线程遍历, 顺序会打乱, 根据适合场景使用
场景: 少量数据, 遍历数据修改操作
采用1000条数据遍历进行修改对象内容
@Test
public void test02() {
List<TestObject> list = new ArrayList<>();
for (int i = 0; i < 1234567; i++) {
list.add(new TestObject());
}
TimeInterval timer = DateUtil.timer();
for (int i = 0; i < list.size(); i++) {list.get(i).setName(RandomUtil.randomString(64));}
log.info("fori: 消耗 {}ms", timer.intervalRestart());
for (TestObject testObject : list) {testObject.setName(RandomUtil.randomString(64));}
log.info("for(:): 消耗 {}ms", timer.intervalRestart());
list.forEach(item -> item.setName(RandomUtil.randomString(64)));
log.info("list.forEach(): 消耗 {}ms", timer.intervalRestart());
list.stream().forEach(item -> item.setName(RandomUtil.randomString(64)));
log.info("list.stream().forEach(): 消耗 {}ms", timer.intervalRestart());
list.stream().forEachOrdered(item -> item.setName(RandomUtil.randomString(64)));
log.info("list.stream().forEachOrdered(): 消耗 {}ms", timer.intervalRestart());
list.parallelStream().forEach(item -> item.setName(RandomUtil.randomString(64)));
log.info("list.parallelStream().forEach(): 消耗 {}ms", timer.intervalRestart());
list.parallelStream().forEachOrdered(item -> item.setName(RandomUtil.randomString(64)));
log.info("list.parallelStream().forEachOrdered(): 消耗 {}ms", timer.intervalRestart());
}
场景: 大量数据, 遍历数据修改操作
采用100多万条数据遍历进行修改对象内容
@Test
public void test02() {
List<TestObject> list = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
list.add(new TestObject());
}
TimeInterval timer = DateUtil.timer();
for (int i = 0; i < list.size(); i++) {list.get(i).setName(RandomUtil.randomString(64));}
log.info("fori: 消耗 {}ms", timer.intervalRestart());
for (TestObject testObject : list) {testObject.setName(RandomUtil.randomString(64));}
log.info("for(:): 消耗 {}ms", timer.intervalRestart());
list.forEach(item -> item.setName(RandomUtil.randomString(64)));
log.info("list.forEach(): 消耗 {}ms", timer.intervalRestart());
list.stream().forEach(item -> item.setName(RandomUtil.randomString(64)));
log.info("list.stream().forEach(): 消耗 {}ms", timer.intervalRestart());
list.stream().forEachOrdered(item -> item.setName(RandomUtil.randomString(64)));
log.info("list.stream().forEachOrdered(): 消耗 {}ms", timer.intervalRestart());
list.parallelStream().forEach(item -> item.setName(RandomUtil.randomString(64)));
log.info("list.parallelStream().forEach(): 消耗 {}ms", timer.intervalRestart());
list.parallelStream().forEachOrdered(item -> item.setName(RandomUtil.randomString(64)));
log.info("list.parallelStream().forEachOrdered(): 消耗 {}ms", timer.intervalRestart());
}
场景: 查询数据库后赋值
分页数据100条, 采用遍历数据每条查询数据库的方式一个一个赋值
@Test
public void test02() {
List<TestObject> list = new ArrayList<>();
for (int i = 0; i < 100; i++) {
list.add(new TestObject());
}
TimeInterval timer = DateUtil.timer();
for (int i = 0; i < list.size(); i++) {list.get(i).setName(accountService.getById("1").getUserName());}
log.info("fori: 消耗 {}ms", timer.intervalRestart());
for (TestObject testObject : list) {testObject.setName(accountService.getById("1").getUserName());}
log.info("for(:): 消耗 {}ms", timer.intervalRestart());
list.forEach(item -> item.setName(accountService.getById("1").getUserName()));
log.info("list.forEach(): 消耗 {}ms", timer.intervalRestart());
list.stream().forEach(item -> item.setName(accountService.getById("1").getUserName()));
log.info("list.stream().forEach(): 消耗 {}ms", timer.intervalRestart());
list.stream().forEachOrdered(item -> item.setName(accountService.getById("1").getUserName()));
log.info("list.stream().forEachOrdered(): 消耗 {}ms", timer.intervalRestart());
list.parallelStream().forEach(item -> item.setName(accountService.getById("1").getUserName()));
log.info("list.parallelStream().forEach(): 消耗 {}ms", timer.intervalRestart());
list.parallelStream().forEachOrdered(item -> item.setName(accountService.getById("1").getUserName()));
log.info("list.parallelStream().forEachOrdered(): 消耗 {}ms", timer.intervalRestart());
}