Java Stream的简单应用

先解释一下各变量含义:

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

目标:此次为工作中实际遇到的问题,需要得到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<String>,泛型为字符串,是因为userid是字符串类型,也就是根据userid的类型生成的,
    //如为Long类型则生成List<Long>,小提示,这是根据某平台的api得到的json数据
    .collect(Collectors.toList());
//过滤出非法传入的userid(userids为外部传入的)
List<String> 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<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;
}

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

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

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

项目中其他使用流的代码

//dtos是UseridDTO类型
long id = dtos.stream()
	//LongStream mapToLong(ToLongFunction<? super T> 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());

在这里插入图片描述

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值