Java 8 流映射减少

标签 java dictionary java-8 java-stream reduce

我对 java 8 流完全陌生,我正在尝试获得以下描述的行为:

class myVO {
    Long id;
    BigDecimal value;
    Date date;
    getter/setter
}

myVO method(Map<Long, myVO> inputMap) {
    return inputMap.stream()
                   .filter(x -> x.getValue().compareTo(BigDecimal.ZERO) > 0)
                   .sorted(); //FIXME
}

我只想获取一个 myVO 对象,它是具有相同日期(最低的那个)的记录的 BigDecimal 值的总和。

例如

xL, 10, 2015/07/07
xL, 15, 2015/07/08
xL, 20, 2015/07/07
xL, 25, 2015/07/09

结果

xL, 30, 2015/07/07

注意id (xL) 不是重要字段。

更新——采用的解决方案(尽管不是单遍)

if(null != map && !map.isEmpty()) {
        Date closestDate = map.values().stream()
                .filter(t -> t.getDate() != null)
                .map(MyVO::getDate)
                .min(Comparator.naturalOrder()).orElse(null);
        myVO.setDate(closestDate);

        BigDecimal totalValue = map.values().stream()
                .filter(x -> x.getValue() != null && x.getValue().signum() != 0)
                .filter(t -> t.getDate().equals(closestDate))
                .map(MyVO::getValue)
                .reduce(BigDecimal::add).orElse(null);
        myVO.setValue(totalValue != null ? totalValue.setScale(2, BigDecimal.ROUND_HALF_DOWN) : totalValue);
    }

最佳答案

考虑到 inputMap 至少有一个条目,可以这样做:

myVO method(Map<Long, myVO> inputMap) {
    Date minDate = inputMap.values().stream().map(myVO::getDate).min(Comparator.naturalOrder()).get();

    BigDecimal sum = inputMap.values().stream().filter(t -> t.getDate().equals(minDate)).map(myVO::getValue).reduce(BigDecimal::add).get();

    myVO myVOObj = new myVO();
    myVOObj.setDate(minDate);
    myVOObj.setValue(sum);
    myVOObj.setId(??);

    return myVOObj;
}

关于Java 8 流映射减少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31972079/

相关文章:

reflection - Java8 流式传输类层次结构

java - 如何在众多 JAR 之间分离 Spring JPA 配置?

java - 带有分页问题的 Youtube Data API v3 java 搜索

objective-c - 将字典项从 plist 转换为 NSArray

python - 获取字典值的 value_counts()

java - 列表结构的流和过滤器

java - 为什么同步块(synchronized block)给出错误的答案?

Java数组,将项目添加到下一个空索引

JavaFX - 在自定义节点上设置focusedProperty Listener

javascript - Mapbox 图层不显示样式更改