无法理解在IntStream上使用collect()

时间:2017-05-11 14:30:17

标签: java java-8

我正在尝试关注代码段,以了解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,但我无法理解编译问题以及使用组合器(第三个参数)。

2 个答案:

答案 0 :(得分:8)

你在那里缺少一些括号......除了IntStream.collect的定义外,还需要两个参数:ObjIntConsumerBiConsumer。两者都将两个参数作为输入并且不返回任何内容。

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,?,?)的参数。

Stream#collect

的组合器

combiner参数接受BiConsumer<R,R>,这意味着您的lambda表达式将接收具有相同类型的2个参数。

AND 它在 parallel 流中用于合并部分结果,直到最终得到最终结果。如果您熟悉它,那就像数组的merge-sort algorithm。和@Eugene在上面的回答中得到了解答。

简而言之 {<1>}永远不会在顺序流中调用。你可以写一个测试来检查它。这是我的测试:

combiner