先解释一下各变量含义:
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"}]
}
维恩图如下

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有冲突,新值覆盖旧值

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