2015-12-10 67 views
4

As this question問python,Java流中Haskell的scanl是什麼?在Java流中Haskell的scanl等價於什麼?

我來了這麼遠,最好是使用

reduce(identity, accumulator, combiner) 

與保持最新成果和積累在列表中的結果,雖然組合大概不會不使用蓄電池。我也不確定如何防止它並行使用,哪裏不行。

也許流是scanl的(相當於)的錯誤接口?

+3

是的,'Stream'不是這裏的正確界面。 Java的Streams只提供可以高效並行化的操作,它不包含任意操作的scanl。 –

回答

5

看起來像標準流API沒有scanl等效。原因之一是scanl嚴格是從左到右的操作,這使得很難從並行處理中獲益(並行處理是Stream API的重要組成部分)。但是,您可能會使用第三方庫,如我的免費StreamEx庫。它擴展了標準流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操作是保證即使在並行流工作,但你不可能有加速,除非你有一些計算密集型上游業務可以並行化。

+4

我知道OP要求輸入流,但是如果你使用的是數組,你也可以考慮使用'Arrays.parallelPrefix';例如'Arrays.parallelPrefix(arr,Integer :: sum);'。這不是一個嚴格的掃描,因爲我認爲它需要一個初始值和一個二元運算符,但是... –

+3

@AlexisC。,是的,這是一個很好的補充(考慮編寫你的答案!)。但是應該注意的是'parallelPrefix'需要一個像'reduce'這樣的關聯函數。 –

相關問題