Stream流的具体使用讲解

Stream流的具体使用讲解,第1张

大四学生刚来公司实习,对于一些Java8的特性还不够了解,今天在业务上有一段代码能够帮助自己更好的了解stream流,在各种百度之后,简单谈一下关于stream的各类方法的具体使用。

凭借个人理解所写,如有不足之处,希望大佬们斧正。

流的使用首先要搞懂lambda表达式

该表达式自Java8引入,简单来讲lambda表达式就是将一段代码赋值给一个变量,如此使用简洁优雅,该表达式所关注的只有两点,一是入参,二是执行逻辑。

本文使用了大量的lambda表达式,该表达式箭头左右两侧分别是参数以及执行逻辑,理解本文对于stream流会有一个基本的了解。

该代码的使用场景在于将已经传入的一个dto实体类,实体类中有一个creatorName字段以及一个createdBy字段,接收的时候只有一个createdby字段我们要做的是根据Int类型的createdBy字段在系统数据库里查询相应的数据库里面有个User表User表的id与createdBy是一致的,所以可以根据user表的用户realName设置给creatorname。

关于该代码的上下文

@Override
    public Page selectList(PageRequest pageRequest, SoHeaderDto dto) {
        Page page = PageHelper.doPageAndSort(pageRequest, () -> soHeader23955Repository.selectList(Utils.transformObj(dto, SoHeader23955.class)));
        String userIds = page.getContent().stream().map(l -> l.getCreatedBy().toString()).collect(Collectors.toSet()).stream().collect(Collectors.joining(","));
        if (StringUtils.isNotEmpty(userIds)) {
            List users = baseUserRepository.selectByIds(userIds);
            page.getContent().forEach(l -> {
                l.setCreatorName(users.stream().filter(u -> u.getId().equals(l.getCreatedBy())).findFirst().get().getRealName());
            });
        }
        return page;
    }

要讲解的关于流的代码

String userIds = page.getContent().stream().map(l -> l.getCreatedBy().toString()).collect(Collectors.toSet()).stream().collect(Collectors.joining(","));

最开始page.getContent方法是返回一个list集合(这是利用一个封装好的方法)

之后.stream().map()是将其转换成流的方式,map方法是将当前流的元素从一种数据类型转换成新的数据类型,即你可以将一个集合的某一个字段给转换数值类型。在这里我们获得了需要处理的createdBy字段然后使用了toString方法转换成了String类型。

之后的 collect(Collectors.toSet())方法是将list集合转换成set集合,原因在于set集合无序且不允许重复,在这里简单给大家看一下三种集合的特点

 将转换好的集合再次设置为流(流每一次迭代完毕都会失效)之后使用 collect(Collectors.joining(","),该方法返回的是字符串 

 到此我们就完成了对一个list数组的某一个int类型字段的无重复化以及转换成String类型的处理。

之后我们就可以根据我们获取得到的id集合获取用户信息了

    List users = baseUserRepository.selectByIds(userIds);
            page.getContent().forEach(l -> {
                l.setCreatorName(users.stream().filter(u -> u.getId().equals(l.getCreatedBy())).findFirst().get().getRealName());
                });

对这个集合的每个creatorname字段进行处理,首先使用遍历将每个类对象取出来,然后将user表里转换成流使用fliter进行筛选获取第一个值之后getname即可。

我刚开始学的时候对于fliter和foreach还有点懵,其实很简单fliter类似于一个工具一个漏斗将符合条件的字段筛选出来,foreach是对每个成员都进行处理

最后简单谈一下对于学习流的看法,对于新人来说,流的使用确实有点晦涩难懂,我觉得最好的学习方式就是要到实际场景上去尝试,尝试多了就会用了,用多了便很容易理解了,有的时候会用和理解与否并不矛盾。在实际开发中,单个的实体类往往很少用到,用的最多的还是list集合用法,流的使用可以极大地提高效率,还是很有必要去学习的

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/795122.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存