正如this question要求使用python一样,Java流中Haskell的scanl等效于什么?
到目前为止,我想出的最好的方法是使用
reduce(identity, accumulator, combiner)
使用一个累加器,该累加器保留最新的结果并将结果累加到一个列表中,尽管大概不会使用组合器。我也不知道如何防止它不能并行使用。
也许Stream是scanl的错误接口(interface)(或等同于scanl)?
最佳答案
看起来标准的Stream API没有scanl
等效项。原因之一是scanl
是严格从左到右的操作,这使得很难从并行处理中受益(并且并行处理是Stream API的重要组成部分)。但是,您可以使用第三方库,例如我的免费StreamEx库。它扩展了标准Stream API,添加了更多有用的功能,包括 scanLeft
:
List<Integer> list = IntStreamEx.range(10).boxed().scanLeft(Integer::sum);
System.out.println(list);
// outputs [0, 1, 3, 6, 10, 15, 21, 28, 36, 45]
保证
scanLeft
操作即使在并行流中也可以使用,但是除非您有一些可以并行化的计算密集型上游操作,否则您不可能实现加速。