将值与Java8流组合

art*_*nig 3 java java-8 rx-java java-stream

如果我有一个带整数的列表,有没有办法构建另一个列表,如果新列表的头部差异低于threashold,则整数总和?我想用Java 8流来解决这个问题.它应该类似于RxJava 的Scan运算符.

Example: 5, 2, 2, 5, 13    
Threashold: 2    
Result: 5, 9, 13

Intermediate results:    
5
5, 2
5, 4 (2 and 2 summed)
5, 9 (4 and 5 summed)
5, 9, 13
Run Code Online (Sandbox Code Playgroud)

Tag*_*eev 7

顺序流解决方案可能如下所示:

List<Integer> result = Stream.of(5, 2, 2, 5, 13).collect(ArrayList::new, (list, n) -> {
    if(!list.isEmpty() && Math.abs(list.get(list.size()-1)-n) < 2)
        list.set(list.size()-1, list.get(list.size()-1)+n);
    else
        list.add(n);
}, (l1, l2) -> {throw new UnsupportedOperationException();});
System.out.println(result);
Run Code Online (Sandbox Code Playgroud)

虽然它看起来不是很好的旧解决方案:

List<Integer> input = Arrays.asList(5, 2, 2, 5, 13);
List<Integer> list = new ArrayList<>();
for(Integer n : input) {
    if(!list.isEmpty() && Math.abs(list.get(list.size()-1)-n) < 2)
        list.set(list.size()-1, list.get(list.size()-1)+n);
    else
        list.add(n);
}
System.out.println(list);
Run Code Online (Sandbox Code Playgroud)

似乎您的问题不是关联的,因此无法轻松并行化.例如,如果将输入拆分为这样的两个组(5, 2), (2, 5, 13),则无法说明是否应合并第二个组的前两个项,直到处理完第一个组.因此,我无法指定正确的组合器功能.