收集器还原功能的区别

问题描述 投票:0回答:0

我尝试了两种不同的 Java 的 Collectors Reducing 函数,结果有两种,还没有弄清楚为什么。

我有一个行李清单,其中行李是这样定义的

class Baggage {
    int num;
    int weight;
}
Baggage bag1 = new Baggage(1, 10);
Baggage bag2 = new Baggage(1, 23);

我正在尝试映射该列表并生成一个 Map,其中键由行李的重量标识,值是一个减少的行李对象,我只关心行李的总和。

第一个还原版本:

Map<Integer, Baggage> mergedBag = baggages.stream()
        .collect(Collectors.groupingBy(
                Baggage::getWeight,
                Collectors.reducing(new Baggage(0, 0), b -> b,
                        (b1, b2) -> {
                            b1.setNum(b1.getNum() + b2.getNum());
                            return b1;
                        }
                )
        ));

当我使用这个合并函数时,我弄乱了集合并导致 Map 中的两个值的总数为 2 而不是 1

{
    "23": {
        "num": 2,
        "weight": 0
    },
    "10": {
        "num": 2,
        "weight": 0
    }
}

改良还原版:

Map<Integer, Optional<Baggage>> mergedBag2 = baggages.stream()
        .collect(Collectors.groupingBy(
                Baggage::getWeight,
                Collectors.reducing((b1, b2) -> {
                            b1.setNum(b1.getNum() + b2.getNum());
                            return b1;
                        }
                )
        ));

但是如果我使用第二个版本,它就会出现预期的结果

{
    "23": {
        "num": 1,
        "weight": 23
    },
    "10": {
        "num": 1,
        "weight": 10
    }
}

所以我的问题是两个减少函数之间的区别是什么,为什么第一个减少它会弄乱其他键的 num 值,这是否意味着映射中的所有值都使用相同的累积返回值,我确实挖掘了在实施中,但还没有太多了解。请帮助我!

java java-stream collectors reducing
© www.soinside.com 2019 - 2024. All rights reserved.