我有一个问题,我认为这对于流和/或lambda来说是完美的。另一方面,我不想过于复杂,但是由于将在许多变体中使用此特定技术(在子列表上运行功能),因此我想一些有关如何从一开始就正确处理它的想法。
我有一个List<Product> productList
。
我希望能够遍历productList
中的所有子列表。例如,所有子列表的大小为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来实现?
编辑
我试图提出最简单的示例来说明问题。经过一番评论,我意识到一个完美的例子是计算移动平均线。在子列表[0..29]上计算第一个MAVG,在[1..30]上计算第二个,在[2..31]上计算第三个,依此类推。
最佳答案
除非我缺少明显的东西...
IntStream.range(0, products.size() - 29)
.mapToObj(i -> products.subList(i, i + 30))
.map(list -> calc(list))
.forEach... // or any other terminal op
好吧,如果您想运行更多功能,则可以对这些子列表使用单个函数,例如:
double result = calc(sublist)
log(sublist) // void
double res = diffCalc(sublist)
您可能不再使用通常的for循环。
map
操作对子列表执行单个操作,可以使它在流中执行更多操作,但是IMO看起来确实很丑。