我們習慣於在Haskell中使用foldr
(例如,使用Java語法)a List<T>
,並且返回所需的任何類型(<T>
,List<T>
等)。Haskell在Java中的foldr相當於
例如在Haskell,該函數採用一個List<Integer>
和返回另一個List<Integer>
和用途的儲液器List<Integer>
(僅是一個示例,該函數的objetive無所謂):
evens :: [Integer] -> [Integer]
evens = foldr (\ x acc -> if mod x 2 == 0 then x : acc else acc) []
現在的Java 8是地地道道的具有功能性風格特點,我們要寫功能(不僅是免費複製,相當於一個List<T>
的),帶着一種foldr
因爲我們這裏使用:
public static Double entropy (List<Double> probs){
return -probs.stream().reduce(0.0, (acc, p) -> acc + p * Math.log(p, 2));
}
使用reduce
的問題是,當我們採取List<T>
時,我們只能返回<T>
,我們希望返回不同的類型或集合。
有沒有在Java中8做foldr
的方法嗎?
您能否提供一個示例輸入/輸出來更好地理解需求? – Tunaki
如果我閱讀Haskell的權利(我從來沒有做過Haskell,但我可以嘗試),似乎你只篩選甚至是元素並將它們收集到列表中。這將是:'probs.stream()。filter(i - > i%2 == 0).collect(toList())'。 – Tunaki
@Tunaki問題是我們需要一種類似我們提供的示例中的累加器。 – Nico