Java8 快速处理List数据

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.stream()
.sorted(Comparator
.<OTicketDesignatedEntity,Integer>comparing(k-> Integer.valueOf(k.getCreateBy()))
.thenComparing(k->Integer.valueOf(k.getUpdateBy())));

将list中对象的createBy和updateBy转换成Integer类型,然后先对createBy排序,再对updateBy排序
注意的点: 需要指定类型以及比较器 上述代码表示指定的对象的类型是OTicketDesignatedEntity,比较器是Integer比较器

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值