我有一个问题,我认为这对于流和/或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看起来确实很丑。

07-24 09:46