Java Streams:关于收集到Map <String,Object>的问题

Jor*_*rdi 14 java java-8 java-stream

我遇到了一个问题:

我创建了这个我需要映射到的流Map<String, Object>:

private Map<String, Object> collectArguments(JoinPoint point) {
    CodeSignature signature = (CodeSignature) point.getSignature();
    String[] argNames = signature.getParameterNames();
    Object[] args = point.getArgs();

    return IntStream.range(0, args.length)
        .collect(Collectors.toMap(param -> argNames[param], param -> args[param]));
}
Run Code Online (Sandbox Code Playgroud)

我收到以下消息,我不太清楚:

[Java] Type mismatch: cannot convert from Collector<Object,capture#3-of ?,Map<Object,Object>> to Supplier<R>
Run Code Online (Sandbox Code Playgroud)

Era*_*ran 17

IntStream没有collect接受a 的方法Collector.它只有一个collect具有此签名的3参数方法:

<R> R collect(Supplier<R> supplier,
              ObjIntConsumer<R> accumulator,
              BiConsumer<R, R> combiner)
Run Code Online (Sandbox Code Playgroud)

也许你应该使用Stream<Integer>:

return IntStream.range(0, args.length)
                .boxed()
                .collect(Collectors.toMap(param -> argNames[param],
                                          param -> args[param]));
Run Code Online (Sandbox Code Playgroud)

或者,如果您希望使用collect方法IntStream,它将如下所示:

return IntStream.range(0, args.length)
                .collect(HashMap::new,
                         (m,i)->m.put(argNames[i],args[i]),
                         (m1,m2)->m1.putAll (m2));
Run Code Online (Sandbox Code Playgroud)

要么

return IntStream.range(0, args.length)
                .collect(HashMap::new,
                         (m,i)->m.put(argNames[i],args[i]),
                         Map::putAll);
Run Code Online (Sandbox Code Playgroud)