java 8 利用流将对象集合中的相同对象的相同属性进行计算并返回新的对象集合

该博客探讨了如何使用Java8的流处理来合并具有相同ID的对象,重点在于nums和sums字段的累加。文章通过两种不同的流处理方式实现合并,并指出了在处理过程中因修改数据源导致的结果差异。最后,提供了修改后的代码以避免数据源被修改,确保结果一致。
摘要由CSDN通过智能技术生成
public class BillsNums {
    private String id;
    private int nums;
    private int sums;

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public int getNums() {
        return nums;
    }
    public void setNums(int nums) {
        this.nums = nums;
    }
    public int getSums() {
        return sums;
    }
    public void setSums(int sums) {
        this.sums = sums;
    }
    public static void main(String[] args) {

        List<BillsNums> billsNumsList = new ArrayList<>();
        BillsNums billsNums = new BillsNums();
        billsNums.setId("1001");
        billsNums.setNums(2);
        billsNums.setSums(100);
        billsNumsList.add(billsNums);

        BillsNums billsNums1 = new BillsNums();
        billsNums1.setId("1002");
        billsNums1.setNums(2);
        billsNums1.setSums(100);
        billsNumsList.add(billsNums1);

        BillsNums billsNums2 = new BillsNums();
        billsNums2.setId("1001");
        billsNums2.setNums(3);
        billsNums2.setSums(100);
        billsNumsList.add(billsNums2);
        BillsNums billsNums3 = new BillsNums();
        billsNums3.setId("1001");
        billsNums3.setNums(6);
        billsNums3.setSums(500);
        billsNumsList.add(billsNums3);

        List<BillsNums> result = merge(billsNumsList);
        System.out.println("方法一:" + JSON.toJSONString(result, true));
        List<BillsNums> result1 = merge1(billsNumsList);
        System.out.println("方法二:" + JSON.toJSONString(result1, true));
    }

    /**
     * 将相同id的对象进行合并nums, sums 相加道回合并后的集合使用Java8的流进行处理
     */
    public static List<BillsNums> merge(List<BillsNums> list) {
        Map<String, BillsNums> map = new HashMap<>();
        list.stream()
                .forEach(billsNums -> {
                    BillsNums last = map.get(billsNums.getId());
                    if(null != last){
                        billsNums.setSums(billsNums.getSums() + last.getSums());
                        billsNums.setNums(billsNums.getNums() + last.getNums());
                        map.put(billsNums.getId(), billsNums );
                    }else{
                        map.put(billsNums.getId(), billsNums);
                    }
                });
        return map.values().stream().collect(Collectors.toList());

    }

    /**
     * 将相同id的对象进行合并nums, sums 相加道回合并后的集合使用Java8的流进行处理
     */
    public static List<BillsNums> merge1(List<BillsNums> list) {
        List<BillsNums> result = list.stream()
                // 表示id为key, 接着如果有重复的,那么从BillsNums对象o1与o2中筛选出一个,这里选择o1,
                // 并把id重复,需要将nums和sums与o1进行合并的o2, 赋值给o1,最后返回o1
                .collect(Collectors.toMap(BillsNums::getId, a -> a, (o1,o2)-> {
                    o1.setNums(o1.getNums() + o2.getNums());
                    o1.setSums(o1.getSums() + o2.getSums());
                    return o1;
                })).values().stream().collect(Collectors.toList());
        return result ;
    }


}

方法一和方法二分开执行,结果相等;同时执行结果不同(由于方法一执行时修改了数据源!)

将方法二修改如下:

public static List<BillsNums> merge1(List<BillsNums> list) {
        List<BillsNums> result = list.stream()
                // 表示id为key, 接着如果有重复的,那么从BillsNums对象o1与o2中筛选出一个,这里选择o1,
                // 并把id重复,需要将nums和sums与o1进行合并的o2, 赋值给o1,最后返回o1
                .collect(Collectors.toMap(BillsNums::getId, a -> a, (o1,o2)-> {
                    BillsNums newbill=new BillsNums();
                    newbill.setId(o1.getId());
                    newbill.setNums(o1.getNums() + o2.getNums());
                    newbill.setSums(o1.getSums() + o2.getSums());
                    return newbill;
                })).values().stream().collect(Collectors.toList());
        return result ;
    }

然后同时运行结果是一样的!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尚雪莲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值