stream().map()的使用

在工作中,常常遇到将一个对象列表中的id属性提取成一个列表 代码实现如下

List<Long> oIds = attrType.stream().
map(s->Long.parseLong(s.getId())).collect(Collectors.toList());

其中 s有属性为Id 类型为String类型 Long.paresLong将s的id转换为Long类型

stream().filter().map()结合使用

业务需求: 有一用户信息列表,用户信息列表中可能存在张三用户的多个信息,要求从这个用户信息列表筛选出张三用户的全部信息,并截取这些信息当中的消费数据(List)属性获得List<消费数据>的属性,只取List中的第一个元素

实现如下:

List<Consumption> consumptions = userInfo.stream().
	filter(k->k.getName().equals("张三")).
	map(UserInfo::getConsumptions()).
	findFirst().
	orElse(null);

filter(k->k.getName().equals(“张三”)): 表示筛选出姓名为张三的数据 组成 List<UserInfo>
map(UserInfo::getConsumptions()): 表示截取UserInfo中的Consumptions属性字段组成List
findFirst: 查找返回结果的第一个元素
orElse: 如果上述筛选结果为null时返回 null.(注:orElse() 括号决定结果为null时整条语句的返回结果)

orElse()和orElseGet()的区别

orElse(T) 无论前面Optional容器是null还是non-null,都会执行 orElse 里的方法,orElseGet(Supplier) 并不会

筛选后去重

业务需求:有一天一个班所有人的打卡记录 每个人每次打卡都会被记录下来,需要从这些数据里得到不重复的id列表 假设从数据库将这天的数据全部查询出来,不考虑sql筛选的情况,全都由后端处理
实现代码如下:

List<Long> uIds = 
userInfo.stream().map(UserInfo::getId).distinct().collect(Collectors.toList())

userInfo.stream().map(UserInfo::getId): 通过这段语句将全部Id信息筛选出来 此时的列表是有很多重复的id的.在筛选的结果上加上 .distinct() 完成去重
可以发现,这里的操作和数据库中的sql查询很像,事实上java8中的筛选器就是为了让我们使用java代码完成数据库中sql语句对查询数据的处理

此处还有一种方案如下:
可以使用Collectors.collectingAndThen(Collectors.toCollection(TreeSet::new), ArrayList::new) 完成需求.
**Collectors.collectingAndThen()**可以对对象进行去重,更强大更灵活

排序

业务需求: 将无需的Set集合变成有序的Set集合
实现代码如下:

timeSet = timeSet.stream().sorted().collect(Collectors.toCollection(TreeSet::new));

sorted()用于排序 默认为自然排序 sorted(Comparator.reverseOrder()) 为倒序,由于Set的特点是无序不重复,因此这里需要转为有序的TreeSet集合

另一种方式:

Set<String> collect = dto.getTimeSet().stream() .sorted(Comparator.comparing(String::toString)) .collect(Collectors.toCollection(LinkedHashSet::new));

综合使用

List<String> timeList = corrosionVOList.stream().
                map(CorrosionVO::getTime).
                sorted(String::compareTo).
                distinct().
                collect(Collectors.toList());

该行代码的作用:将List<CorrosionVO>中每一个元素的time属性提取成一个List,同时对它进行排序,并且去掉重复数据

list转map

Map<String, List<EngyAnalysisVO>> engyAnalaysListMap = 
engyAnalysisList.stream().
collect(
Collectors.groupingBy(engyAnalysisVO -> engyAnalysisVO.getObjName()));

将List<EngyAnalysisVO>根据对象中的名称属性进行分组 key为objName,Value为List

另还有一种List转换成Map的方式

Map<String, String> dataMap = dictData.stream()
.collect(Collectors.toMap(DictData::getDictLabel, DictData::getDictValue));

即 将dictData 对象的DictLabel属性和DictValue属性作为一组键值对 将DictData对象列表转化为Map<String,String>

字符串列表转换成用逗号隔开的字符串

List<String> list = new ArrayList<>();
list.add("hello");
list.add("world");
String str = list.stream.map(String::valueOf()).collect(Collectors.joining(","));
// str = hello,world