工作中Java Stream的简单应用
admin
2024-02-10 04:33:59

标题

    • 开发使用
    • filter() and map()
    • max()根据集合对象中的某个属性取最大值

先解释一下各变量含义:

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

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

开发使用

//把对象集合转换为字符串集合(根据对象的某一属性)
//map函数的作用就是针对管道流中的每一个数据元素进行转换操作。
List 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 cache = userids.stream()//过滤:筛选符合条件的进行保留(并非是过滤掉符合条件的),不符合条件的去除.filter(o -> !temps.contains(o))//再把流转成List集合,也可使用Collectors.toMap()转成Map集合,不过这个需要传参,另说.collect(Collectors.toList());
{//此为responseBO"errcode":0,"errmsg":"ok","items":[{//UseridItem"userid":"xxxxx","new_userid":"AAAA"},{"userid":"yyyyy","new_userid":"BBBB"}]
}

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

filter() and map()

    List userInfoList = new ArrayList<>();userInfoList.add(new UserInfo(1, "小明", 18));userInfoList.add(new UserInfo(2, "小林", 27));userInfoList.add(new UserInfo(2, "小李", 26));Map 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;
}

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);

相关内容

热门资讯

赤水性价比粮食酒推荐:2025... 赤水性价比粮食酒推荐:2025年酱香酒选购全攻略 一、开篇背景与市场痛点 2025年的赤水河流域酒类...
非白酒板块11月19日跌0.3... 证券之星消息,11月19日非白酒板块较上一交易日下跌0.33%,*ST椰岛领跌。当日上证指数报收于3...
以运河文化赋能产业发展|古贝春... 11月17日至19日,以“新质开新局,聚力创未来”为主题的2025年第六届中国白酒黄淮核心产区高质量...
深夜小酌的灵魂搭档:油炝脆骨,... 油炝脆骨是一道充满锅气与烟火气息的家常菜,以其爽脆的口感和浓郁的香辣风味深受许多人喜爱。这道菜的制作...
初中毕业新征程:为什么西点烘焙... 站在初中毕业的人生路口,许多女孩都在思考:哪条路能通往一个既美好又独立的未来?如果有一条道路,能将女...