Java在一个窗口大小的周期内进行计数(例如size=3)

use*_*812 7 java java-stream

给定下面的类和数据结构,我想计算每个连续 3 个元素的计数总和,类似于以下结果:

public class SaleTxn {
    private int id;
    private String txnDate;
    private int amount;

}
Run Code Online (Sandbox Code Playgroud)

数据如下

 id   txnDate        amount
    1    2018-10-10     100
    2    2018-10-11     200
    3    2018-10-12     100
    4    2018-10-13     100
    5    2018-10-14     200
    6    2018-10-15     200
    ... ...
Run Code Online (Sandbox Code Playgroud)

并且窗口大小为 3,表示只是过去 3 个元素的总和,预期结果如下

2018-10-10 ~ 2018-10-12   Total: 100+200+100 = 400
2018-10-13 ~ 2018-10-14   Total: 100+200+200 = 500
...
Run Code Online (Sandbox Code Playgroud)

我在下面有一个列表代码:

List<SaleTxn> myList; //
myList.stream().filter(x -> ??????)
                .mapToInt(SouthboundShareholding::getAmount)
                .sum();
Run Code Online (Sandbox Code Playgroud)

我该如何实施?

Ton*_*hen 3

我认为核心问题是分区列表,如果你可以使用Google Guava,这将非常简单,如下代码所示:

代码:

List<SaleTxn> saleTxns = new ArrayList<>();
saleTxns.add(new SaleTxn(1, "2018-10-10", 100));
saleTxns.add(new SaleTxn(2, "2018-10-11", 200));
saleTxns.add(new SaleTxn(3, "2018-10-12", 100));
saleTxns.add(new SaleTxn(4, "2018-10-13", 100));
saleTxns.add(new SaleTxn(5, "2018-10-14", 200));
saleTxns.add(new SaleTxn(6, "2018-10-15", 200));

// implement of filter
saleTxns = saleTxns.stream().filter(saleTxn -> true).collect(Collectors.toList());

// partition the list and sum all value
List<Integer> result = Lists.partition(saleTxns, 3).stream()
    .mapToInt(value -> value.stream().mapToInt(SaleTxn::getAmount).sum())
    .boxed()
    .collect(Collectors.toList());

System.out.println(result);
Run Code Online (Sandbox Code Playgroud)

代码的输出:

[400, 500]
Run Code Online (Sandbox Code Playgroud)