java8特性stream

stream与parallelStream

两者的区别在于stream是同步执行,考虑先后顺序,而parallelStream是异步执行,多个cup通道同时执行,不考虑先后顺序,
在日常开发中更推荐使用stream

一、map方法

  1. 实体类中取出某个字段并收集成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));
  1. 通过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());
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vace cc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值