stream与parallelStream
两者的区别在于stream是同步执行,考虑先后顺序,而parallelStream是异步执行,多个cup通道同时执行,不考虑先后顺序,
在日常开发中更推荐使用stream
一、map方法
- 实体类中取出某个字段并收集成list
例:传回的是list<实体类>,根据实体类中的id能查询表,这时候普通的就for循环
//x就代表每一个实体类、也是循环中的实体类
// UserList为实体类的集合 List<User>
//map中也可以写成map(User::getId)
List<String> collect = userList.stream().map(x -> x.getId).collect(Collectors.toList());
//这时候就可以通过List<String>进行查询啦
//例:
List<UserCp> cpList = userCpService.list(new LambdaQueryWrapper<UserCp>().in(UserCp::getId,collect));
- 通过map进行复杂判断,并收集
例:通过id查询是否存在该数据,存在则保留不存在为空
旧:
在function中就很有意思,他可以进行很多操作,例如:save操作、update操作,例:查询的数据过期在这里进行更新状态等等。(记得在@Override下添加Transactional)
Function<User, “这里是你要返回的类型:实体类、字符串等”>
List<User> newUserList = userList.stream().map(new Function<User, User>() {
@Override
public User apply(User user) {
UserCp one = userCpService.getOne(new LambdaQueryWrapper<UserCp>()
.eq(UserCp::getId, user.getId()));
if (Objects.isNull(one)) {
return null;
}
return user;
}
}).collect(Collectors.toList());
新:
List<User> newUserList = userList.stream().map(user -> {
UserCp one = userCpService.getOne(new LambdaQueryWrapper<UserCp>()
.eq(UserCp::getId, user.getId()));
if (Objects.isNull(one)) {
return null;
}
return user;
}).collect(Collectors.toList());
项目上的代码片段:
二、 filter
filter日常都是用来根据条件收集数据的,并没有什么太多的操作地方
例:收集List<实体类>中不为空的数据,并赋值给自己
collect = collect.stream().filter(x -> !Objects.isNull(x)).collect(Collectors.toList());
//收集非空,只要出现就停止,类似for循环break;
Optional<BaseCabinet> any = collect.stream().filter(x -> !Objects.isNull(x)).findAny();
//是否有值
any.isPresent()
//获取值
any.get()
三、forEach
可以利用forEach进行求和
例:求数量
这里需要注意,需要将数据粒子化,用到方法AtomicReference,求和用的是updateAndGet()方法、取值使用count.get()就行了
AtomicReference<Integer> count = new AtomicReference<>(0);
collect.stream().forEach(x -> count.updateAndGet(v -> v + x.getCount()));
例:求价钱
BigDecimal方法:
加法 add()函数、减法subtract()函数、乘法multiply()函数、除法divide()函数、绝对值abs()函数
BigDecimal与int、double等类型计算时需要转换成BigDecimal。
AtomicReference<BigDecimal> sumPrice = new AtomicReference<>();
//Price价格(BigDecimal类型)、Count数量(int类型)
List<BigDecimal> collect1 = collect.stream().map(x -> x.getPrice().multiply(new BigDecimal(x.getCount()))).collect(Collectors.toList());
collect1.stream().forEach(x -> sumPrice.updateAndGet(v -> v.add(x)));
//优化:
AtomicReference<BigDecimal> sumPrice = new AtomicReference<>();
collect1.stream().forEach(x -> sumPrice.updateAndGet(v -> v.add(x.getPrice().multiply(new BigDecimal(x.getCount())))));
四、sorted
可以使用sorted的比较器将数据按照某个字段进行排序
Comparator.comparing(BaseCabinetListVo::getCabinetCode)
.reversed()为倒叙
.limit(1)为取前几位
collect.stream().sorted(Comparator.comparing((UserCp::getId).reversed()).limit(1).collect(Collectors.toList());