我们在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 已经发布了并且具有函数式特性,我们想要使用一种类似于 foldr
的方式来编写函数(不仅仅是一个没有重复的List<T>
)。
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
的方法?
probs.stream().filter(i -> i % 2 == 0).collect(toList())
。 - Tunaki