本文将介绍List集合的Stream流方法操作。
实体类
给定一个实体类
1 |
|
将对象集合转成对象中某个属性的集合
1 | List<ReviewerRest> list = new ArrayList<>(); |
将某个属性的集合转成对象集合
1 | List<Long> ids = new ArrayList<>(); |
判断集合中是否有一个对象包含某个属性
1 | boolean exist = list.stream().anyMatch(rest -> rest.getReviewerId().equals(1000L)); |
对集合中某个对象的属性求和
1 | BigDecimal reduce = list.stream().map(ReviewerRest::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add); |
集合转 Map (普通)
1 | <Long, ReviewerRest> map = list.stream().collect(Collectors.toMap(ReviewerRest::getId, x -> x)); |
集合转 Map (key 存在重复)
当集合中 id 会存在重复时,上面那种方式会报错,此时需要指定重复时选用哪一个 value
1 | Map<Long, ReviewerRest> map = list.stream().collect(Collectors.toMap(ReviewerRest::getId, x -> x, (before, after) -> after)); |
集合转 Map (value 存在 null 值)
当 value 存在 null 值时上面那种方式会报错,此时需要换一种写法
1 | Map<Long, LocalDate> map = list.stream().collect(HashMap::new, (mapItem, item) -> mapItem.put(item.getId(), item.getDate()), HashMap::putAll); |
集合分组 转 Map
1 | Map<Long, List<ReviewerRest>> map = list.stream().collect(Collectors.groupingBy(ReviewerRest::getId)); |
集合分区 转 Map
1 | Map<Boolean, List<ReviewerRest>> map = list.stream().collect(Collectors.partitioningBy(r -> r.getRest() == 1)); |
集合分组个数统计
1 | Map<Long, Long> map = list.stream().collect(Collectors.groupingBy(ReviewerRest::getId,Collectors.counting())); |
集合分组转某个属性集合
1 | Map<Long, List<Integer>> map = list.stream().collect(Collectors.groupingBy(ReviewerRest::getId,Collectors.mapping(ReviewerRest::getRest,Collectors.toList()))); |
集合分组聚合查询最大元素
1 | Map<Long, Optional<ReviewerRest>> map = list.stream().collect(Collectors.groupingBy(ReviewerRest::getReviewerId, Collectors.maxBy(Comparator.comparing(ReviewerRest::getDate)))); |
集合分组聚合求和
1 | // 目前只支持 int、double、long |
flatMap 获取嵌套集合最小值
给定一个数据结构
要获取最内层 billList
最小的截止日期可以使用 flatMap
1 | LocalDate min = loanList.stream().flatMap(loan -> loan.getBillList().stream()) |