我正在尝试关注代码段,以了解collect
上的IntStream
方法以了解相关内容。我试图得到Hashmap <string, Integer>
。
IntStream.range(0, 4).collect(
HashMap::new,
result, t -> result.put("test", somearray.get(t)),
result -> result.putall()
);
但汇编抱怨,can't find symbol variable result
。
根据我的理解,我需要将(t, value) -> ...
传递给accumulatore
,但我无法理解编译问题以及使用组合器(第三个参数)。
答案 0 :(得分:8)
你在那里缺少一些括号......除了IntStream.collect
的定义外,还需要两个参数:ObjIntConsumer
和BiConsumer
。两者都将两个参数作为输入并且不返回任何内容。
int somearray[] = new int[] { 1, 5, 6, 7 };
HashMap<String, Integer> map = IntStream.range(0, 4).collect(
HashMap::new,
(result, t) -> result.put("test" + t, somearray[t]),
(left, right) -> left.putAll(right));
答案 1 :(得分:0)
如果在lambda表达式接受多于1个参数时不使用括号,则第一个参数result
将视为方法调用collect(?,result,?,?)
的参数。
combiner
参数接受BiConsumer<R,R>
,这意味着您的lambda表达式将接收具有相同类型的2个参数。
AND 它在 parallel 流中用于合并部分结果,直到最终得到最终结果。如果您熟悉它,那就像数组的merge-sort algorithm。和@Eugene在上面的回答中得到了解答。
简而言之 {<1>}永远不会在顺序流中调用。你可以写一个测试来检查它。这是我的测试:
combiner