关于后端:Java8-各种集合的-Stream-操作示例

41次阅读

共计 2610 个字符,预计需要花费 7 分钟才能阅读完成。

前言
本篇文章是个笔记篇 …… 其实专门是写给共事的,他说他不会用 Java8 之后的 lambda 操作,这 Java18 都进去了,你 Java8 还没玩熟,这真是狗听了都摇摇头啊

吐槽
不违心接触新事物的人,你怎么科普他都不会违心去学~~ 函数接口、泛型、断言(Predicate)、生产(Consumer)、提供(Supplier)等等,所以我也不说原理了,间接写代码示例吧。。。须要的时候间接复制粘贴,实体类名改掉就 OK。
给定一个实体类
@Data
public class ReviewerRest {
private Long id;
private Long reviewerId;
private Bigdecimal price;
private LocalDate date;
private Integer rest;
}
复制代码
将对象汇合转成对象中某个属性的汇合
List<ReviewerRest> list = new ArrayList<>();
List<Long> ids = list.stream().map(ReviewerRest::getId).collect(Collectors.toList());
复制代码
将某个属性的汇合转成对象汇合
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());
复制代码
判断汇合中是否有一个对象蕴含某个属性
boolean exist = list.stream().anyMatch(rest -> rest.getReviewerId().equals(1000L));
//…… allMatch 和 anyMatch 相似
复制代码
对汇合中某个对象的属性求和
BigDecimal reduce = list.stream().map(ReviewerRest::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
复制代码
汇合转 Map(一般)
Map<Long, ReviewerRest> map = list.stream().collect(Collectors.toMap(ReviewerRest::getId, x -> x));
复制代码
汇合转 Map(key 存在反复)
当汇合中 id 会存在反复时,下面那种形式会报错,此时须要指定反复时选用哪一个 value
Map<Long, ReviewerRest> map = list.stream().collect(Collectors.toMap(ReviewerRest::getId, x -> x, (before, after) -> after));
复制代码
汇合转 Map(value 存在 null 值)
当 value 存在 null 值时下面那种形式会报错,此时须要换一种写法
Map<Long, LocalDate> map = list.stream().collect(HashMap::new, (mapItem, item) -> mapItem.put(item.getId(), item.getDate()), HashMap::putAll);
复制代码
汇合分组 转 Map
Map<Long, List<ReviewerRest>> map = list.stream().collect(Collectors.groupingBy(ReviewerRest::getId));
复制代码
汇合分区 转 Map
Map<Boolean, List<ReviewerRest>> map = list.stream().collect(Collectors.partitioningBy(r -> r.getRest() == 1));
复制代码
汇合分组个数统计
Map<Long, Long> map = list.stream().collect(Collectors.groupingBy(ReviewerRest::getId,Collectors.counting()));
复制代码
汇合分组转某个属性汇合
Map<Long, List<Integer>> map = list.stream().collect(Collectors.groupingBy(ReviewerRest::getId,Collectors.mapping(ReviewerRest::getRest,Collectors.toList())));
复制代码
汇合分组聚合查问最大元素
Map<Long, Optional<ReviewerRest>> map = list.stream().collect(Collectors.groupingBy(ReviewerRest::getReviewerId, Collectors.maxBy(Comparator.comparing(ReviewerRest::getDate))));
复制代码
汇合分组聚合求和
// 目前只反对 int、double、long
Map<Long, Long> map = list.stream().collect(Collectors.groupingBy(ReviewerRest::getReviewerId, Collectors.summingLong(ReviewerRest::getRest)));
复制代码
flatMap 获取嵌套汇合最小值
给定一个数据结构

要获取最内层 billList 最小的截止日期能够应用 flatMap
LocalDate min = loanList.stream().flatMap(loan -> loan.getBillList().stream())

.map(CallStrategyPlanDetail.Bill::getDueDate)
.min(LocalDate::compareTo)
.orElseThrow();

复制代码
结语
这篇文章没什么好说的,也不算一篇文章,做个笔记吧。。。当前有用到的话间接过去 copy …… 临时只想起来这么多,后续用到其余再来更新~~

正文完
 0