java8 stream流 根据字段分组统计求和 lambda表达式

本文展示了如何使用Java 8 Stream API分别处理整数(int)和大数(BigDecimal)类型的Good对象列表,通过分组、聚合并按total倒序排序。实例演示了groupingBy、map和reduce操作在不同数据类型上的应用。
摘要由CSDN通过智能技术生成

直接代码:上面代码是int,下面是bigDecimal

public class StreamTest {
    public static void main(String[] args) {

        List<Good> list = new ArrayList<>();
        Good g1 = new Good(1,"x",1);
        Good g2 = new Good(2,"x",1);
        Good g3 = new Good(1,"x",2);
        Good g4 = new Good(3,"y",8);
        list.add(g1);
        list.add(g2);
        list.add(g3);
        list.add(g4);
        // 创建几个对象放在list集合中

        List<Good> collect1 = list.stream()
                // 根据name进行分组
                .collect(Collectors.groupingBy(Good::getId))
                .entrySet()
                .stream()
                .map(entry -> {
                    int key = entry.getKey();
                    List<Good> value = entry.getValue();
                    Integer sum = value.stream().mapToInt(Good::getTotal).sum();
                    return new Good(key,sum);
                })
                // 根据total倒序排序
//                .sorted(Comparator.comparing(Good::getTotal).reversed())
                .collect(Collectors.toList());
        System.out.println(collect1.toString());
    }
}


@Data
@AllArgsConstructor
class Good {
    private int id;
    private String name;
    private int total;

    public Good(int id, int total) {
        this.id = id;
        this.total = total;
    }
}

结果:

[Good(id=1, name=null, total=3), Good(id=2, name=null, total=1), Good(id=3, name=null, total=8)]
BigDecimal:
package com.ali99.java.test.stream;

import lombok.AllArgsConstructor;
import lombok.Data;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class StreamTest {
    public static void main(String[] args) {

        List<Good> list = new ArrayList<>();
        Good g1 = new Good(1,"x",new BigDecimal(1));
        Good g2 = new Good(2,"x",new BigDecimal(1));
        Good g3 = new Good(1,"x",new BigDecimal(2));
        Good g4 = new Good(3,"y",new BigDecimal(8));
        list.add(g1);
        list.add(g2);
        list.add(g3);
        list.add(g4);
        // 创建几个对象放在list集合中

        List<Good> collect1 = list.stream()
                // 根据name进行分组
                .collect(Collectors.groupingBy(Good::getId))
                .entrySet()
                .stream()
                .map(entry -> {
                    int key = entry.getKey();
                    List<Good> value = entry.getValue();
                    BigDecimal sum = value.stream().map(Good::getTotal).reduce(BigDecimal.ZERO,BigDecimal::add);
                    return new Good(key,sum);
                })
                // 根据total倒序排序
//                .sorted(Comparator.comparing(Good::getTotal).reversed())
                .collect(Collectors.toList());
        System.out.println(collect1.toString());
    }
}
@Data
@AllArgsConstructor
class Good {
    private int id;
    private String name;
    private BigDecimal total;

    public Good(int id, BigDecimal total) {
        this.id = id;
        this.total = total;
    }
}

结果一样

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值