在学Java Stream,由于有Clojure的函数式编程经验,所以对函数式编程有点想当然了,不知道在Java这个语言中写函数式会是怎么样的,他娘的又编译不通过
clojure 代码
(reduce (fn [r x]
(assoc r x
(inc (get r x 0)))) {} (range 0 99))
java stream
Map<Integer,Integer> res = new HashMap<>();
Map<Integer,Integer> map = Stream.iterate(1,x->x+1).limit(100).reduce(res,(m,x)-> {
int count = Optional.ofNullable(m.get(x)).orElse(0) + 1;
m.put(x,count);
return m;
});
嗯??
demo.java:16: 错误: 对于reduce(Map<Integer,Integer>,(m,x)->{ i[...] m; }), 找不到合适的方法
Map<Integer,Integer> map = Stream.iterate(1,x->x+1).limit(100).reduce(res,(m,x)-> {
^
方法 Stream.reduce(Integer,BinaryOperator<Integer>)不适用
(参数不匹配; Map<Integer,Integer>无法转换为Integer)
方法 Stream.<U>reduce(U,BiFunction<U,? super Integer,U>,BinaryOperator<U>)不适用
(无法推断类型变量 U
(实际参数列表和形式参数列表长度不同))
其中, U,T是类型变量:
U扩展已在方法 <U>reduce(U,BiFunction<U,? super T,U>,BinaryOperator<U>)中声明的Object
T扩展已在接口 Stream中声明的Object
注: 某些消息已经过简化; 请使用 -Xdiags:verbose 重新编译以获得完整输出
1 个错误