gpt4 book ai didi

java - 流集合错误和理解

转载 作者:行者123 更新时间:2023-11-30 11:14:04 27 4
gpt4 key购买 nike

我正在尝试使用 java 8 的 Stream API 读取 CSV 文件并从中创建一个矩阵。

这里主要是为了学习Stream(当然还有其他方法可以不用Stream)。

代码如下:

public class MatrixCreator {

public static Function<String, List<Double>> mapLineToListOfDoubles = (line) -> {
String [] elements = line.split(",\\s*");
return Arrays.stream(elements).map((String stringElement) -> Double.parseDouble(stringElement)).collect(Collectors.toList());
};

//Error from this -- listed below
public static Collector<List<Double>, List<Double>, List<Double>> listCollector = Collector.of(ArrayList<Double>::new, List<Double>::addAll, (ArrayList<Double> left, List<Double> right) -> {
left.addAll(right);
return left;
});


/**
* Creates a matrix from the specified file.
* @param filePath Path to CSV, matrix, file
*/
public static Matrix createMatrix(String filePath) throws IOException {
FileInputStream fileInputStream = new FileInputStream(filePath);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
List<Double> x = bufferedReader.lines().map(mapLineToListOfDoubles).collect(listCollector);
return null; // for the moment.
}
}

报错如下:

Error:(26, 96) java: no suitable method found for of(ArrayList<[...]::new,List<Doubl[...]ddAll,(ArrayList[...]ft; })
method java.util.stream.Collector.<T,R>of(java.util.function.Supplier<R>,java.util.function.BiConsumer<R,T>,java.util.function.BinaryOperator<R>,java.util.stream.Collector.Characteristics...) is not applicable
(inferred type does not conform to equality constraint(s)
inferred: java.util.List<java.lang.Double>
equality constraints(s): java.util.List<java.lang.Double>,java.util.ArrayList<java.lang.Double>)
method java.util.stream.Collector.<T,A,R>of(java.util.function.Supplier<A>,java.util.function.BiConsumer<A,T>,java.util.function.BinaryOperator<A>,java.util.function.Function<A,R>,java.util.stream.Collector.Characteristics...) is not applicable
(cannot infer type-variable(s) T,A,R
(actual and formal argument lists differ in length))

显然 Java 无法确定要使用的方法,但我无法确定从这里到哪里去。

对于此错误原因的任何帮助,我将不胜感激。

最佳答案

唯一Collector.of可以匹配您提供的参数数量的方法是:

static <T,R> Collector<T,R,R>   of(Supplier<R> supplier, BiConsumer<R,T> accumulator, BinaryOperator<R> combiner, Collector.Characteristics... characteristics)

您将返回类型声明为 Collector<List<Double>, List<Double>, List<Double>> , 所以两者都是 TRList<Double> .

但是,在您的参数列表中,组合器(第三个参数)接收到一个带有两个参数的 lambda 表达式 ArrayList<Double> leftList<Double> right返回 ArrayList<Double> .但是方法签名需要一个 BinaryOperator<R>这意味着两个参数+lambda表达式的返回值必须是同一类型。

我建议您将代码更改为:

public static Collector<List<Double>, List<Double>, List<Double>> listCollector = Collector.of(ArrayList<Double>::new, List<Double>::addAll, (List<Double> left, List<Double> right) -> {
left.addAll(right);
return left;
});

我不确定这是否是唯一的问题(我无法测试它),但很有可能是,因为这就是您从编译器得到的错误消息所暗示的:

  (inferred type does not conform to equality constraint(s)
inferred: java.util.List<java.lang.Double>
equality constraints(s): java.util.List<java.lang.Double>,java.util.ArrayList<java.lang.Double>)

错误消息的其余部分无关紧要,因为另一个 Collector.of方法需要一个额外的参数,因此与您的代码无关。

关于java - 流集合错误和理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26106613/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com