Java8 快速实现List转map 、分组、过滤等操作

list 分组成 map

Map> groupBy = appleList.stream().collect(Collectors.groupingBy(Apple::getId));

list直接转成map并且key去重

需要注意的是:toMap 如果集合对象有重复的key,会报错Duplicate key ....
apple1,apple12的id都为1。
可以用 (k1,k2)->k1 来设置,如果有重复的key,则保留key1,舍弃key2

Map appleMap = appleList.stream().collect(Collectors.toMap(Apple::getId, a -> a,(k1,k2)->k1))

过滤filter

// 过滤出符合条件的数据
List filterList = appleList.stream().filter(a -> a.getName().equals("香蕉")).collect(Collectors.toList());

求和

// 计算总金额
BigDecimal totalMoney = appleList.stream().map(Apple::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add);

查找流中最大 最小值

// Collectors.maxBy 和 Collectors.minBy 来计算流中的最大或最小值。
Optional maxDish = Dish.menu.stream().collect(Collectors.maxBy(Comparator.comparing(Dish::getCalories))); 
Optional minDish = Dish.menu.stream().collect(Collectors.minBy(Comparator.comparing(Dish::getCalories)));

去重

// 根据id去重
 List unique = appleList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Collectors.comparingLong(Apple::getId))), ArrayList::new));

Collectors 类的静态工厂方法。

工厂方法 返回类型 作用
toList List 把流中的所有元素收集到一个List
toSet Set 把流中的所有元素收集到一个Set,删除重复项
toCollection Collection 把流中所有元素收集到给定的容器中menuStream.collect(toCollection(), ArrayList::new)
counting Long 计算流中的元素个数
sumInt Integer 对流中的一个整数进行求和
averagin Double 计算流中integer属性的平均值
summarizingInt IntSummaryStatistics 收集关于流中 Integer 属性的统计值,例如最大、最小、 总和与平均值
joining String 连接对流中每个元素调用 toString 方法所生成字符串collect(joining(", "))
maxBy Optoinal 一个包裹了流中按照给定比较器选出的最大元素的 Optional, 或如果流为空则为 Optional.empty()
minBy Optional 一个包裹了流中按照给定比较器选出的最小元素的 Optional, 或如果流为空则为 Optional.empty()
reducing 从一个作为累加器的初始值开始,利用 BinaryOperator 与流 中的元素逐个结合,从而将流归约为单个值累加int totalCalories = menuStream.collect(reducing(0, Dish::getCalories, Integer::sum));
collectingAndThen 包裹另一个收集器,对其结果应用转换函数int howManyDishes = menuStream.collect(collectingAndThen(toList(), List::size))
groupingBy Map> 根据项目的一个属性的值对流中的项目作问组,并将属性值作 为结果 Map 的键
partitioningBy Map 根据对流中每个项目应用谓词的结果来对项目进行分区

你可能感兴趣的:(Java8 快速实现List转map 、分组、过滤等操作)