Java8 各种集合的 Stream 操作示例

本文将介绍List集合的Stream流方法操作。

实体类

给定一个实体类

1
2
3
4
5
6
7
8
@Data
public class ReviewerRest {
private Long id;
private Long reviewerId;
private Bigdecimal price;
private LocalDate date;
private Integer rest;
}

将对象集合转成对象中某个属性的集合

1
2
List<ReviewerRest> list = new ArrayList<>();
List<Long> ids = list.stream().map(ReviewerRest::getId).collect(Collectors.toList());

将某个属性的集合转成对象集合

1
2
3
4
5
6
7
8
9
List<Long> ids = new ArrayList<>();

List<ReviewerRest> list = ids.stream().map(id -> {
ReviewerRest rest = new ReviewerRest();
rest.setRest(1);
rest.setDate(LocalDate.now());
rest.setReviewerId(1000L);
return rest;
}).collect(Collectors.toList());

判断集合中是否有一个对象包含某个属性

1
2
boolean exist = list.stream().anyMatch(rest -> rest.getReviewerId().equals(1000L));
//...... allMatch 和 anyMatch 类似

对集合中某个对象的属性求和

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
2
// 目前只支持 int、double、long
Map<Long, Long> map = list.stream().collect(Collectors.groupingBy(ReviewerRest::getReviewerId, Collectors.summingLong(ReviewerRest::getRest)));

flatMap 获取嵌套集合最小值

给定一个数据结构

要获取最内层 billList 最小的截止日期可以使用 flatMap

1
2
3
4
LocalDate min = loanList.stream().flatMap(loan -> loan.getBillList().stream())
.map(CallStrategyPlanDetail.Bill::getDueDate)
.min(LocalDate::compareTo)
.orElseThrow();
点击查看

本文标题:Java8 各种集合的 Stream 操作示例

文章作者:LiJing

发布时间:2023年07月23日 - 16:54:16

最后更新:2023年07月23日 - 17:04:02

原始链接:https://blog-next.xiaojingge.com/posts/1293708724.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------------本文结束 感谢您的阅读-------------------