java - 在 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]
whereobject1
并object2
具有一些属性组合,这使得有必要创建一个新object5
的来替换它们,结果将是[object5, object3, object4]
.
我的实际用例要复杂一些,但是在迭代列表时这个想法是相似的,但不会减少到单个原子值。
解决方案
减少是 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 配合使用。
推荐阅读
- python - 计算 Numpy 数组的 n 长度的滚动平均值
- java - 无法使用 itextpdf 阅读 PDF
- java - java - 如何在具有泛型参数和返回类型方法的java中使用反射获取类的实例?
- flutter - Dart 命名构造函数 vs 静态方法更喜欢什么?
- python - 如何使用 Django Rest Framework 在 CRUD API 中使用其他 URL
- git-lfs - GitAhead 大文件存储
- kubernetes - 如何在 Kubernetes 中为 statefulsets 资源设置适当的权限?
- json - 如何在 file_get_content 的结果中忽略 PHP 通知?
- reactjs - 等待 react-router history.goBack 完成
- php - 以编程方式在现有表中添加行和列,无需迁移 -laravel 刀片