Java 流集合错误与理解
我正在尝试使用Java8的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
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)
withDouble::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>)