背景
java8的Stream类,在最初java8出来的时候,就学习了一遍,然后随着时间的推移,全忘了,全忘了。。。。。。所以打算捡起来,把平时经常用到的做个记录。
Stream
过滤
List<UserInfo> userInfoListAfter = userInfoList.stream()
.filter(userInfo -> StringUtils.isNotBlank(userInfo.getName()))
.collect(Collectors.toList());
只获取某个字段的值
List<String> dealerCodes = userInfo.getPositionList().stream()
.filter(position -> StringUtils.isNotBlank(position.getDealerCode()))
.map(Position::getDealerCode)
.collect(Collectors.toList());
将List转换为Map
// value 为某个字段值
Map<String, String> SaleCustomerTypeDTMap = saleCustomerList.stream()
.collect(Collectors.toMap(SaleCustomerTypeDTO::getTypeCode, SaleCustomerTypeDTO::getName, (v1, v2) -> v2));
// value 为对象
Map<String, SaleCustomerTypeDTO> SaleCustomerTypeDTMap = saleCustomerList.stream()
.collect(Collectors.toMap(SaleCustomerTypeDTO::getTypeCode, v -> v, (v1, v2) -> v2));
将List分组
Map<Long, List<DmsContractFieldValueDO>> fieldValueGroupMap = contractFieldValueDOList.stream()
.collect(Collectors.groupingBy(DmsContractFieldValueDO::getContractId));
计算List中每个元素出现的次数
// key name, value 出现次数
Map<String, Long> nameCountMap = nameList.stream()
.collect(Collectors.groupingBy(name -> name, Collectors.counting()));
将List排序
List<DmsApplyDO> sortedById = dmsApplyDOS.stream()
.sorted(Comparator.comparing(DmsApplyDO::getId))
.collect(Collectors.toList());
分组求和
// 计算每个月份的合计, key-年月, value-月度合计
Map<Integer, BigDecimal> monthValueMap = monthValueDTOList.stream()
.collect(Collectors.groupingBy(MonthValueDTO::getYearMonth))
.entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey,
entry -> entry.getValue().stream()
.filter(monthValueDTO -> Objects.nonNull(monthValueDTO.getValue()))
.map(MonthValueDTO::getValue)
.reduce(BigDecimal.ZERO, BigDecimal::add)
)
);
借鉴
使用java8的Stream,根据Object某些属性对List进行筛选。
java8 Stream API中Collectors中toMap方法的问题以及解决
Java 8 Stream 对实体类中的 BigDecimal 分组求和