Java 8 lambda(List->Map、过滤、类型转换、分组、求和)

多个list取交集

public static List<Element> retainElementList(List<List<Element>> elementLists) {
     
        Optional<List<Element>> result = elementLists.parallelStream()
            .filter(elementList -> elementList != null && ((List) elementList).size() != 0)
            .reduce((a, b) -> {
                a.retainAll(b);
                return a;
        });
        return result.orElse(new ArrayList<>());
    }

List 转Map

    /**
     *  * List -> Map
     *  * 需要注意的是:
     *  * toMap 如果集合对象有重复的key,会报错Duplicate key ....
     *  *  apple1,apple12的id都为1。
     *  *  可以用 (k1,k2)->k1 来设置,如果有重复的key,则保留key1,舍弃key2
     */
    private void listToMap(){
        List<Item> itemList = initList();
        Map<Long,Item> itemMap =  itemList.parallelStream().collect(Collectors.toMap(Item::getId, item -> item,(k1, k2)->k1));
    }

过滤

    /**
     * 从集合中过滤出来符合条件的元素:
     */
    private void filter(){
        List<Item> itemList = initList();
        List<Item> itemFilter =itemList.parallelStream().filter(item -> item.getId()!=null).filter(item -> item.getId()>0).collect(Collectors.toList());
    }

类型转换

    /**
     * 类型转换
     */
    private void typeConversion(){
        List<String> stringList = new ArrayList<>();
        List<Long> longList = stringList.parallelStream().map(Long::valueOf).collect(Collectors.toList());
    }

分组

    /**
     * 分组
     */
    private void groupingBy(){
        List<Item> itemList = initList();
        Map<Long,List<Item>> itemMap = itemList.parallelStream().collect(Collectors.groupingBy(Item::getId));
    }

求和

    /**
     * 属性求和
     */
    private void sum(){
        List<Item> itemList = initList();
        BigDecimal totalBigDecimal =  itemList.parallelStream().map(Item::getBigDecimal).reduce(BigDecimal.ZERO,BigDecimal::add);
        itemList.parallelStream().mapToDouble(Item::getScore).sum();
    }

查找流中最大 最小值

public void maxMin(){
    Optional<Dish> maxDish = Dish.menu.stream().collect(Collectors.maxBy(Comparator.comparing(Dish::getCalories)));
    maxDish.ifPresent(System.out::println);

    Optional<Dish> minDish = Dish.menu.stream().collect(Collectors.minBy(Comparator.comparing(Dish::getCalories)));
    minDish.ifPresent(System.out::println);
}

去重

// 根据id去重
public void dd(){
	List<AppColumnsDto> collect = list.stream().collect(
		Collectors.collectingAndThen(Collectors.toCollection(() ->
				new TreeSet<>(Comparator.comparingLong(AppColumnsDto::getId))
	), ArrayList::new));
}
Collectors类的静态工厂方法
工厂方法返回类型作用
toListList<T>把流中所有项目收集到一个 List
toSetSet<T>把流中所有项目收集到一个 Set,删除重复项
toCollectionCollection<T>把流中所有项目收集到给定的供应源创建的集合menuStream.collect(toCollection(), ArrayList::new)
countingLong计算流中元素的个数
sumIntInteger对流中项目的一个整数属性求和
averagingIntDouble计算流中项目 Integer 属性的平均值
summarizingIntIntSummaryStatistics收集关于流中项目 Integer 属性的统计值,例如最大、最小、 总和与平均值
joiningString连接对流中每个项目调用 toString 方法所生成的字符串collect(joining(", "))
maxByOptional<T>一个包裹了流中按照给定比较器选出的最大元素的 Optional, 或如果流为空则为 Optional.empty()
minByOptional<T>一个包裹了流中按照给定比较器选出的最小元素的 Optional, 或如果流为空则为 Optional.empty()
reducing归约操作产生的类型从一个作为累加器的初始值开始,利用 BinaryOperator 与流 中的元素逐个结合,从而将流归约为单个值累加int totalCalories = menuStream.collect(reducing(0, Dish::getCalories, Integer::sum));
collectingAndThen转换函数返回的类型包裹另一个收集器,对其结果应用转换函数int howManyDishes = menuStream.collect(collectingAndThen(toList(), List::size))
groupingByMap<K, List<T>>根据项目的一个属性的值对流中的项目作问组,并将属性值作 为结果 Map 的键
partitioningByMap<Boolean,List<T>>根据对流中每个项目应用谓词的结果来对项目进行分区

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用Java 8的流(Stream)和Lambda表达式来对`List<Map<String, Object>>`进行分组求和操作。以下是一个示例代码: ```java import java.util.*; import java.util.stream.Collectors; public class GroupingSum { public static void main(String[] args) { List<Map<String, Object>> dataList = new ArrayList<>(); Map<String, Object> data1 = new HashMap<>(); data1.put("category", "A"); data1.put("value", 10); dataList.add(data1); Map<String, Object> data2 = new HashMap<>(); data2.put("category", "B"); data2.put("value", 20); dataList.add(data2); Map<String, Object> data3 = new HashMap<>(); data3.put("category", "A"); data3.put("value", 30); dataList.add(data3); Map<String, Object> data4 = new HashMap<>(); data4.put("category", "B"); data4.put("value", 40); dataList.add(data4); // 分组求和 Map<String, Integer> sumByCategory = dataList.stream() .collect(Collectors.groupingBy( e -> (String) e.get("category"), Collectors.summingInt(e -> (Integer) e.get("value")) )); // 输出结果 for (Map.Entry<String, Integer> entry : sumByCategory.entrySet()) { System.out.println(entry.getKey() + ": " + entry.getValue()); } } } ``` 上述代码定义了一个`dataList`,其中包含多个`Map`对象,每个`Map`对象都有两个键值对,分别是"category"和"value"。使用`Collectors.groupingBy`方法对"category"进行分组,然后使用`Collectors.summingInt`方法对"value"进行求和。最后将结果打印出来。 运行上述代码,输出结果如下: ``` A: 40 B: 60 ``` 这表示"category"为"A"的"value"之和为40,"category"为"B"的"value"之和为60。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值