【发布时间】:2017-08-28 18:36:53
【问题描述】:
我有一个问题,我觉得它非常适合流和/或 lambda。另一方面,我不想让这件事变得过于复杂,但由于将在许多变体中使用这种特定技术(在子列表上运行函数),我想要一些关于如何从一开始就正确使用它的想法。
我有一个List<Product> productList。
我希望能够遍历productList 中的所有子列表。例如所有 size=30 的子列表。然后应该将此子列表用作函数的参数。
这是我目前的幼稚解决方案:
List<Product> products=...
// This example uses sublists of size 30
for (int i = 0; i < products.size() - 29; i++) {
// sublist start index is inclusive, but end index is exclusive
List<Product> sublist = products.subList(i, i + 30);
Double res = calc(sublist);
}
// an example of a function would be moving average
这将如何使用 lambdas 实现?
编辑 我试图想出一个最简单的例子来说明这个问题。在一些 cmets 之后,我意识到一个完美的例子是计算移动平均线。第一个 MAVG 在子列表 [0..29] 上计算,第二个在 [1..30] 上计算,第三个在 [2..31] 上计算,依此类推。
【问题讨论】:
-
相反,使用流和 lambda 不会使代码更具可读性。
-
您要解决的更大问题是什么,为什么需要 30 个子列表?此外,您制作的不是 30 大小的子列表,而是一个比完整列表小的 29 个产品的列表。
-
这只是一个例子,上面的代码可以工作(至少原来使用相同类型的解决方案 - 这是一个简化的例子)。有关更多上下文,请参阅编辑。
-
@ZhekaKozlov 不是真的,使用那个例子,我想要子列表:['a','b','c'],['b','c'.'d'],[ 'c','d','e'],['d','e','f'] 等等,就像一个“滑动窗口”
标签: java list lambda java-8 java-stream