Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Streams:关于收集到地图的问题<;字符串,对象>;_Java_Java 8_Java Stream - Fatal编程技术网

Java Streams:关于收集到地图的问题<;字符串,对象>;

Java Streams:关于收集到地图的问题<;字符串,对象>;,java,java-8,java-stream,Java,Java 8,Java Stream,我遇到了一个问题: 我已创建此流,需要映射到映射: 私有映射参数(连接点){ CodeSignature signature=(CodeSignature)point.getSignature(); 字符串[]argNames=signature.getParameterNames(); Object[]args=point.getArgs(); 返回IntStream.range(0,args.length) .collect(Collectors.toMap(param->argNames[

我遇到了一个问题:

我已创建此流,需要映射到
映射

私有映射参数(连接点){
CodeSignature signature=(CodeSignature)point.getSignature();
字符串[]argNames=signature.getParameterNames();
Object[]args=point.getArgs();
返回IntStream.range(0,args.length)
.collect(Collectors.toMap(param->argNames[param],param->args[param]);
}
我得到了以下信息,我不太明白:

[Java] Type mismatch: cannot convert from Collector<Object,capture#3-of ?,Map<Object,Object>> to Supplier<R>
[Java]类型不匹配:无法从收集器转换为供应商

IntStream
没有接受
收集器的
collect
方法。它只有一个具有此签名的3参数
collect
方法:

<R> R collect(Supplier<R> supplier,
              ObjIntConsumer<R> accumulator,
              BiConsumer<R, R> combiner)
或者,如果您希望使用
IntStream
collect
方法,它将如下所示:

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

另一种方法(第一种变体,使用
非常简洁)是首先将数组的内容映射到一个对象:

public class Argument {
  private final String argName;
  private final Object arg;

  public Argument(String argName, Object arg) {
    this.argName = argName;
    this.arg = arg;
  }

  public String getArgName() {
    return argName;
  }

  public Object getArg() {
    return arg;
  }
}
将此对象收集到地图的代码将成为一个非常清晰简洁的基本流:

Map<String, Object> map = IntStream.range(0, args.length)
    .mapToObj(i -> new Argument(argNames[i], args[i]))
    .collect(Collectors.toMap(Argument::getArgName, Argument::getArg));
这样,您的
collectArguments()
方法将是一个简单的单行程序:

private Map<String, Object> collectArguments(JoinPoint point) {
  return toArguments(point).stream().collect(toMap(Argument::getArgName, Argument::getArg));
}
私有映射参数(连接点){
返回参数(point).stream().collect(toMap(参数::getArgName,参数::getArg));
}
public class Argument {
  private final String argName;
  private final Object arg;

  public Argument(String argName, Object arg) {
    this.argName = argName;
    this.arg = arg;
  }

  public String getArgName() {
    return argName;
  }

  public Object getArg() {
    return arg;
  }
}
Map<String, Object> map = IntStream.range(0, args.length)
    .mapToObj(i -> new Argument(argNames[i], args[i]))
    .collect(Collectors.toMap(Argument::getArgName, Argument::getArg));
private List<Argument> toArguments(JoinPoint point) {
  String[] argNames = ((CodeSignature) point.getSignature()).getParameterNames();
  return IntStream.range(0, point.getArgs().length)
      .mapToObj(i -> new Argument(argNames[i], point.getArgs()[i]))
      .collect(Collectors.toList());
}
private Map<String, Object> collectArguments(JoinPoint point) {
  return toArguments(point).stream().collect(toMap(Argument::getArgName, Argument::getArg));
}