基于Object属性的Java 8 Stream Filer

时间:2019-03-16 21:27:51

标签: java collections java-8 java-stream

我正在尝试使用Java 8中的流从映射中获取所有值的总和。以下是我拥有的Collection:

Map<BigDecimal, List<Object>> map = ...... //some elements in this map

假设对象具有以下属性:

BigDecimal previousAmount;
int typeCode;

我试图获取所有键列表中每个对象的所有previousAmount的总和。以下是我想出的内容:

BigDecimal previousAmt = map.values().stream().flatMap(List::stream)
            .map(Object::previousAmount).reduce(BigDecimal.ZERO, (a, b) -> a.add(b));

这给了我列表中所有元素的总和以及所有键的正确值。但是我仅在typeCode大于10的情况下才尝试过滤并获取总和。

有人可以建议如何使用typeCode过滤上述流吗?

1 个答案:

答案 0 :(得分:2)

您可以只使用Stream.filter()方法:

BigDecimal previousAmt = map.values().stream().flatMap(List::stream)
    .filter(i -> i.getTypeCode() > 10) // filters the stream
    .map(MyObject::getPreviousAmount)
    .reduce(BigDecimal.ZERO, BigDecimal::add);