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));
}