[编程问题]Java怎么用Stream统计数字出现频率

在学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 个错误