【发布时间】:2016-02-15 06:20:57
【问题描述】:
我们习惯于在 Haskell 中使用 foldr(例如,使用 Java 语法)List<T>,然后返回所需的任何类型(<T>、List<T> 等)。
例如在 Haskell 中,这个函数接受 List<Integer> 并返回另一个 List<Integer> 并将 List<Integer> 用作累加器(只是一个例子,函数的目标无关紧要):
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?
【问题讨论】:
-
您能否提供一个示例输入/输出以更好地了解需求?
-
如果我正确地阅读了 Haskell(我从未做过 Haskell,但我可以尝试),似乎你只过滤偶数元素并将它们收集到一个列表中。这将是:
probs.stream().filter(i -> i % 2 == 0).collect(toList()). -
@Tunaki 问题是我们需要一种像我们提供的示例中那样的累加器。
-
那么这是一个副本:stackoverflow.com/q/29072355/1743880
-
你检查过the other reduce method吗?
标签: java haskell java-8 reduce fold