标题
- 开发使用
- 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<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);