Java 流集合错误与理解

Java 流集合错误与理解,java,lambda,collections,java-8,Java,Lambda,Collections,Java 8,我正在尝试使用Java8的StreamAPI读取CSV,并从中创建一个矩阵 这主要是为了学习Streams(当然,在没有Streams的情况下,还有其他方法可以做到这一点) 代码如下: public class MatrixCreator { public static Function<String, List<Double>> mapLineToListOfDoubles = (line) -> { String [] elements

我正在尝试使用Java8的
Stream
API读取CSV,并从中创建一个矩阵

这主要是为了学习
Stream
s(当然,在没有
Stream
s的情况下,还有其他方法可以做到这一点)

代码如下:

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.
    }
}
公共类矩阵激励器{
公共静态函数mapLineToListOfDoubles=(行)->{
String[]elements=line.split(“,\\s*”);
返回Arrays.stream(elements).map((String-stringElement)->Double.parseDouble(stringElement)).collect(Collectors.toList());
};
//此错误--如下所列
公共静态收集器listCollector=Collector.of(ArrayList::new,List::addAll,(ArrayList左,List右)->{
左。addAll(右);
左转;
});
/**
*从指定的文件创建矩阵。
*@param filePath指向CSV、矩阵、文件的路径
*/
公共静态矩阵createMatrix(字符串文件路径)引发IOException{
FileInputStream FileInputStream=新的FileInputStream(filePath);
BufferedReader BufferedReader=新的BufferedReader(新的InputStreamReader(fileInputStream));
列表x=bufferedReader.lines().map(mapLineToListOfDoubles.collect(listCollector);
返回null;//暂时返回。
}
}
给出了以下错误:

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))
Error:(26,96)java:找不到适合of(ArrayList)的方法唯一可以匹配您提供的参数数量的方法是:

static <T,R> Collector<T,R,R>   of(Supplier<R> supplier, BiConsumer<R,T> accumulator, BinaryOperator<R> combiner, Collector.Characteristics... characteristics)
我不确定这是否是唯一的问题(我无法测试),但很有可能是这样,因为从编译器得到的错误消息暗示了这一点:

  (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>)
(推断类型不符合相等约束)
推断:java.util.List
相等约束:java.util.List、java.util.ArrayList)

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

绝对有意义!没有注意到这一点。谢谢!您让您的生活变得不必要。您只需从lambda参数sa中省略类型即可正在编写大量样板文件并同时删除错误:
(左,右)->{left.addAll(右);return left;}
。这同样适用于方法引用:您不需要编写
ArrayList::new
List::addAll
。只需
ArrayList::new
List::addAll
就足够了。使用Java 8的类型推断功能。您可以替换
(String-stringElement)->Double.parseDouble(stringElement)
with
Double::parseDouble
  (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>)