减少 Java 8 中的集合

Reducing a Collection in Java 8

我想知道什么是最干净的,也许是惯用的,类似于以下简单示例的方法。

如果我有一个数组(或列表等)[1,1,1,2,3,5,5,9]我想做一些缩减、折叠、添加连续数字,只留下一个元素。

所以 [1,1,1,2,3,5,5,9] 会变成 [3,2,3,10,9]


一个稍微更普遍的案例:

[object1, object2, object3, object4] 其中 object1object2 具有一些属性组合,因此有必要创建一个新的 object5 来替换它们,结果将是成为 [object5, object3, object4].

我的实际用例有点复杂,但在某种程度上迭代列表的想法是相似的,但不会减少到单个原子值。

缩减是 Stream API 这种方式不起作用。 reduction(也称为 fold)的要点是将输入元素组合成一个结果。

只要计算依赖于基于等价的连续元素,这显然不是 Stream API 的合适任务。

你想要这样的东西*...我不知道如何将其“转换”为 Stream API.

List<Integer> list = Arrays.asList(1,1,1,2,3,5,5,9);
List<Integer> newList = new ArrayList<>();

int i = 0;
while (i < list.size()) {
    int current = list.get(i);
    int next = current;
    int sum = 0;
    int j = i;
    while (current == next) {
        j++;
        sum += next;
        if (j < list.size()) {
            next = list.get(j);
        } else break;
    }
    newList.add(sum);
    i = j;
}

// [3, 2, 3, 10, 9]
System.out.println(newList);                  

*就性能和可读性而言,这显然不是最佳解决方案,只要我真的沉迷于“LeetCode”问题解决。这个想法是为了证明这些解决方案不适用于 Stream API.