• 工作中Java Stream的简单应用


    先解释一下各变量含义:

    temps集合是userids的子集(大前提)
    cache是temps集合在userids集合中的补集
    简单来说就是,userids集合-temps集合=cache补集,如下图所示
    
    • 1
    • 2
    • 3

    目标:此次为工作中实际遇到的问题,需要得到cache集合,所以自己实现一下,本想使用正常语法,但是感觉太烦琐,得取多个变量名 (取变量名是最杀脑细胞的了), 总之就想试试Stream,其实在工作中真的很多CV,看看同事写的,复制,粘贴,改参数,改返回值,一条龙,完成。至于我为什么不复制粘贴,一把梭?我是那样的人吗? (主要是没有,日)
    代码实现:根据外部传入的userids集合(是userid的源集合),temps是根据结果得到哪些是有用的userid(有一些不符合条件的过滤了,代码实现也是为了得到被过滤的userid),目标集合cache(是为了存入redis才取此名,把不合法的userid存入redis,)
    这也是我在工作中第一次使用Stream,时隔多日,也顺便复习一下,总结一下

    开发使用

    //把对象集合转换为字符串集合(根据对象的某一属性)
    //map函数的作用就是针对管道流中的每一个数据元素进行转换操作。
    List<String> temps = responseBO.getItems()//返回体在下一个代码块,本应该是对象集合,使用了.map()转成String集合
    	//把集合转成流,集合(经测试不含Map)和数组都有此方法,也可直接使用Stream.of("小明", "小林", "小李");创建一个流
        .stream()
        //得到所有对象中的userid属性
        .map(UseridItem::getUserid)
        //转成List,泛型为字符串,是因为userid是字符串类型,也就是根据userid的类型生成的,
        //如为Long类型则生成List,小提示,这是根据某平台的api得到的json数据
        .collect(Collectors.toList());
    //过滤出非法传入的userid(userids为外部传入的)
    List<String> cache = userids.stream()
        //过滤:筛选符合条件的进行保留(并非是过滤掉符合条件的),不符合条件的去除
        .filter(o -> !temps.contains(o))
        //再把流转成List集合,也可使用Collectors.toMap()转成Map集合,不过这个需要传参,另说
        .collect(Collectors.toList());
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    //此为responseBO
     "errcode":0,
     "errmsg":"ok",
     "items":[
     	{//UseridItem
     		"userid":"xxxxx",
     		"new_userid":"AAAA"
     	},
     	{
     		"userid":"yyyyy",
     		"new_userid":"BBBB"
     	}
     ]
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    维恩图如下
    在这里插入图片描述

    filter() and map()

        List<UserInfo> userInfoList = new ArrayList<>();
        userInfoList.add(new UserInfo(1, "小明", 18));
        userInfoList.add(new UserInfo(2, "小林", 27));
        userInfoList.add(new UserInfo(2, "小李", 26));
        Map<Integer, UserInfo> collect = userInfoList.stream()
        		//得到此集合中年龄大于20的
                .filter(o -> o.getAge() > 20)
                //转成Map集合,不过这样会有问题,当key值重复时
                //Exception in thread "main" java.lang.IllegalStateException: Duplicate key UserInfo(id=2, name=小林, age=27)
                //方式一:key重复会报异常
                //.collect(Collectors.toMap(UserInfo::getId, Function.identity()));
                //.collect(Collectors.toMap(UserInfo::getId, v->v));
                //方式二:(k1,k2)->k1)重复则取之前的值,(k1,k2)->k2)新值覆盖旧真
                //.collect(Collectors.toMap(UserInfo::getId, v->v,(k1,k2)->k1));
        collect.forEach((k,v)-> System.out.println("k = " + k + ",v = " + v));
    ----------------------------------------------------------------
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class UserInfo{
       private int id;
       private String name;
       private int age;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    toMap()方法,key有冲突,保留旧值
    在这里插入图片描述
    toMap()方法,key有冲突,新值覆盖旧值
    在这里插入图片描述

    max()根据集合对象中的某个属性取最大值

    userInfoList.stream()
                .max(Comparator.comparing(UserInfo::getAge))//返回值类型Optional max,java8的新特性,优雅判空,不过我司并未使用
                //如果存在则输出,否则啥也不做,注意public void println(Object x)只能传入一个参数,
                // 所以Map不能使用System.out::println输出
                .ifPresent(System.out::println);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    项目中其他使用流的代码

    //dtos是UseridDTO类型
    long id = dtos.stream()
    	//LongStream mapToLong(ToLongFunction mapper);和map()方法不一样
    	.mapToLong(UseridDTO -> UseridDTO.getId())
    	//OptionalLong max();
    	.max()
    	.getAsLong();
    
    ----
    dtos.stream()
    	.map(UseridDTO::getUserid)
    	//这步是否是多余的?
    	//.collect(Collectors.toList())
    	//.stream()
    	//去重,mysql中有distinct关键字,select distinct * from 表;//去重
    	.distinct()
    	.collect(Collectors.toList());
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

    在图面后缀上拼接
    ?#pic_right =450x//居右,宽450px,长自动,等号左边有个空格
    ?#pic_center =500x//居中500px
    ?#pic_left =500x//默认就是水平居左

  • 相关阅读:
    4.1 一个简单的Linux Kernel模块
    学习笔记-IPC$(Internet Process Connection)
    RocketMQ专题02
    一、项目创建与角色移动
    视频在线压缩
    数据结构刷题
    审计智能合约的成本是多少?如何审计智能合约?
    Java并发面试题&知识点总结(中篇)
    JUC并发编程——四大函数式接口(基于狂神说的学习笔记)
    码蹄集部分题目(2024OJ赛13期;贪心集训+递归集训)
  • 原文地址:https://blog.csdn.net/weixin_58428216/article/details/127982647