list - Java 8 - 积累和创建新的集合

标签 list collections java-8 accumulator collectors

我想使用 java 8 从列表中创建一个新集合,并在此过程中累加总和。

源列表由如下所示的对象组成:

class Event {
  String description;
  double sum;
}

使用这样的示例列表:

{ { "desc1", 10.0 }, {"desc2", 14.0 }, {"desc3", 5.0 } }

结果列表应该是这样的

  • desc1, 10.0, 10.0
  • desc2, 14.0, 24.0
  • desc3, 5.0, 29.0

我知道如何求和以获得最终总和,在本例中为 29.0,但我想创建结果列表并同时累加总和。

我如何用 Java8 做到这一点?

最佳答案

您可以通过实现自己的收集器来执行映射和求和来实现此目的。您的流式传输代码如下所示:

List<SummedEvent> summedEvents = events.stream().collect(EventConsumer::new, EventConsumer::accept, EventConsumer::combine).summedEvents();
summedEvents.forEach((se) -> System.out.println(String.format("%s, %2f, %2f", se.description, se.sum, se.runningTotal)));

为此,我假设了一个新类 SummedEvent,它也包含运行总计。然后你的收集器类将像这样实现:

class EventConsumer {
    private List<SummedEvent> summedEvents = new ArrayList<>();
    private double runningTotal = 0;

    public void accept(Event event) {
        runningTotal += event.sum;
        summedEvents.add(new SummedEvent(event.description, event.sum, runningTotal));
    }
    public void combine(EventConsumer other) {
        this.summedEvents.addAll(other.summedEvents);
        this.runningTotal += other.runningTotal;
    }

    public List<SummedEvent> summedEvents() {
        return summedEvents;
    }
}

关于list - Java 8 - 积累和创建新的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29048739/

相关文章:

list - 如何使用命令netlogo中的所有第四项嵌套列表

arrays - 测试数组是否在 lisp 中的列表中

python 嵌套列表理解

list - 创建保存另一种数据类型的特定值的数据类型

java - ArrayDeque:addLast(E) + removeLast() 与push(E)/pop() 相同吗?更喜欢 addFirst(E) + removeFirst() 有什么优点吗?

hadoop - HBase 与 Java 8 和 zookeeper 有问题

java - 在编码之前动态隐藏一些字段(java 到 json)

Java集合: Does concrete class HashSet which uses Hash table implemented using LinkedList as its data structure?

php - 获取foreach php中的最后一项

java - 关闭映射流 - 什么意思?