JDK8 的新特性给我们开发带来了很大的便利性,先声明,我没有系统的去学习 JDK8的这些所有新特性,本文只是记录一些我个人日常开发中常遇到的一些 JDK8 的新特性方法。
1. 提取对象集合中的某一属性集合:
List<对象> --> List<属性>
contractInfoList.stream().map(ContractInfo::getId).collect(Collectors.toList()); //contractInfoList - 对象集合; ContractInfo - 集合中的对象
提取List<Map> 中 Map 中指定Key的值:
List<Map> --> List<T>
List<String> customerContactIdList = customerContactList.stream().map(Map -> MapUtils.getString(Map, "id")).collect(Collectors.toList()); //customerContactList - List<Map>
2. 根据对象集合中的某一属性分组:
List<对象> --> Map<对象属性, List<对象>>
Map<String, List<SysRight>> sysAccountIdMap = sysRightList.stream().collect(Collectors.groupingBy(SysRight::getAccountId)); //sysRightList - 对象集合;SysRight - 对象
3. 批量重置对象集合中的某个属性值:
objList.forEach(sysDataRelated -> sysDataRelated.getSysAttachment().setDeleteUrl("/xxxx/xxx/xxx"));
4. 对象集合中按照某个属性进行正序排序,考虑空值,把空值放在前面
sysDataRelatedList = sysDataRelatedList.stream().sorted(Comparator.comparing(SysDataRelated::getCreateDate, Comparator.nullsFirst(Date::compareTo))).collect(Collectors.toList());
5.对象集合按照某一个属性进行倒序排序,考虑空值
sysDataRelatedList = sysDataRelatedList.stream().sorted(Comparator.comparing(SysDataRelated::getCreateDate, Comparator.nullsFirst(Date::compareTo).reversed())).collect(Collectors.toList());
6. List<对象>转 Map,指定属性作为 key,当前对象作为 value
Map<String, OrderInfo> orderInfoMap = orderInfoList.stream().collect(Collectors.toMap(OrderInfo::getId, a -> a,(k1,k2)->k1));
7. List<对象>根据指定属性分组
List<T> -> Map<属性, List<T>>
Map<String, List<TagInfoRel>> tagInfoMap = tagInfoRelList.stream().collect(Collectors.groupingBy(TagInfoRel::getDataRelationId));
上述代码最终结果就是以 TagInfoRel 中的属性 dataRelationId 对应的值作为key
8.根据条件过滤
List<String> dataIdList = sysDataRelatedList.stream().filter(s -> null != s.getDataId()).collect(Collectors.toList());
实现效果,从 sysDataReladList 集合中,过滤出 dataId 不为空的记录集合
9.list 分组,多属性拼接分组 List<对象> --> Map<proModelName_proMark, List<对象>>
Map<String, List<CmsProperty>> propertyMap = propertyList.stream().collect(Collectors.groupingBy(propertyKey -> (propertyKey.getProModelName() + "-" + propertyKey.getProMark())));
9.1 list分组,保证分组后顺序不会乱
Map<String, List<CmsProperty>> propertyMap = propertyList.stream().collect(Collectors.groupingBy(CmsProperty::getProModelName, LinkedHashMap::new, Collectors.toList()));
10.list分组,默认获取第一个 List<对象> --> Map<属性, 对象>
Map<String, CmsPropertyModel> propertyModelMap = cmsPropertyModelList.stream().collect(Collectors.groupingBy(CmsPropertyModel::getName, Collectors.collectingAndThen(Collectors.toList(),value->value.get(0))));
11.List<String> 转成 List<Integer>,其他转成 List<Long> 同理
List<Integer> rowNoList = new ArrayList<String>(strList).stream().map(e -> Integer.parseInt(e)).collect(Collectors.toList()); //strList 是List<String> 对象
12.对象集合中某一属性累加
List<OrderPacking> orderPackingList = orderPackingMapper.selectOrderPackingList(dataMap);
orderPackingList.stream().mapToInt(e -> e.getNumber().intValue()).summaryStatistics().getSum(); //因为属性number是BigDecimal类型,所以需要做转换
普通集合累加
Double sum = investorList.stream().mapToDouble(n -> CommonUtils.isNumeric(n.getInvestMoney()) ?
Double.parseDouble(n.getInvestMoney()) : 0.00).summaryStatistics().getSum(); //CommonUtils.isNumeric 判断是否是数字
13. List<Map> 进行分组,并操作分组后的Map数据
Map<String, List<Map>> areaOrderGroupMap = areaMapList.stream().filter(e -> e.containsKey("orderId")).collect(Collectors.groupingBy(e -> MapUtils.getString(e, "receivingProvinceName") + "/" + MapUtils.getString(e, "receivingCityName"), Collectors.collectingAndThen(Collectors.toList(), values -> values.stream().map( d1 -> {
d1.remove("receivingProvince");
d1.remove("receivingCity");
return d1;
}).collect(Collectors.toList()))));
首先过滤map,留下含有key为 orderId 的Map,然后对过滤后的 list<Map> 进行分组,并操作分组完后的map(移除指定的key)
14. List 转 指定分隔符的 字符串
list.stream().map(SysRight::getName).collect(Collectors.joining(","));
15.两个list 合并去重
List3 = Stream.of(List1, List2).flatMap(Collection::stream).distinct().collect(Collectors.toList()); //list1和List2 合并去重生成 list3
16.双层List 转成单层 : List<List<Object>> --> List<Object>
List<List<Object>> demoList = new ArrayList<>();
List<Object> reshult = demoList.stream().collect(ArrayList::new, ArrayList::addAll, ArrayList::addAll);
17.List 中 BigDecimal 累加
BigDecimal totalAmount = dataList.stream().map(data::getTotalAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
18.list 根据指定属性进行合并,其他指定属性进行累加
List<MaterielPurchaseGoodsDto> goodsDtoList = goodsDtoList.stream().collect(Collectors.toMap(MaterielPurchaseGoodsDto::getCustomerId, a -> a, (o1, o2) -> {
o1.setAmount(o1.getAmount().add(o2.getAmount()));
o1.setNumber(o1.getNumber().add(o2.getNumber()));
o1.setAvgPrice(o1.getAmount().divide(o1.getNumber(), 2, BigDecimal.ROUND_HALF_UP));
return o1;
})).values().stream().collect(Collectors.toList());
解析:MaterielPurchaseGoodsDto 中有 customerId, amount, number, avgPrice 属性,当前操作为 将 MaterielPurchaseGoodsDto 列表 根据 customerId 进行合并,合并时,累加 amount, number, avgPrice