首页 > 解决方案 > 在 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]whereobject1object2具有一些属性组合,这使得有必要创建一个新object5 的来替换它们,结果将是[object5, object3, object4].

我的实际用例要复杂一些,但是在迭代列表时这个想法是相似的,但不会减少到单个原子值。

标签: javacollectionsjava-8java-streamfold

解决方案


减少是 Stream API 不能以这种方式工作。减少的点(也称为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 配合使用。


推荐阅读