栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Stream流的具体使用讲解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Stream流的具体使用讲解

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

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

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

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

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

该代码的使用场景在于将已经传入的一个dto实体类,实体类中有一个creatorName字段以及一个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(","));

该代码的使用场景在于将已经传入的一个dto实体类,实体类中有一个creatorName字段以及一个createdBy字段,我们要做的是根据Int类型的createdBy字段在系统数据库里查询相应的数据库creatorname设置成String类型的creatorName

最开始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集合用法,流的使用可以极大地提高效率,还是很有必要去学习的

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/850092.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号