我已经审查了“可能相关”的问题,但是它们似乎没有帮助;我也是一个初学者,尤其是Java8的初学者,所以请多多包涵!
问题-我想将包含值列表(在这种情况下为双数字)的文件读取到数组中。我将这些作为辅助类中的方法来执行,因为我希望在我的项目中需要多次执行此操作。
我已经创建了一个简单的方法将文件转换为二维双精度数组-
public static double[][] Double2DMatrixFromFile(String input) throws IOException
{
Path path = Paths.get(input);
return Files.lines(path)
.map((x) -> Stream.of(x).mapToDouble(Double::parseDouble).toArray())
.toArray(double[][]::new);
}
这有效,并且我一直在成功使用它。然后,我想尝试将包含一长串大数字的文件读入一维数组,因此尝试快速修改上面的方法,使其看起来像这样-
public static double[] DoubleArrayFromFile(String input) throws IOException
{
Path path = Paths.get(input);
return Files.lines(path)
.map((y) -> Stream.of(y).mapToDouble(Double::parseDouble).toArray())
.toArray(double[]::new);
}
但是,这拒绝编译,我也不知道为什么。确切的错误是
错误:(57,17)java:接口中的toArray方法 java.util.stream.Stream无法应用于给定类型;
必需:java.util.function.IntFunction找到:double [] :: new
原因:推断变量A具有不兼容的范围 平等约束:双重 上限:java.lang.Object
鉴于这种情况在第一种情况下仍然有效,因此我不清楚该不兼容的地方。
很抱歉,这似乎很明显,但是我对编码非常陌生。
答案 0 :(得分:2)
您的第一种方法以Stream<String>
开头,将其映射到Stream<double[]>
,然后将其转换为二维数组(double[][]
)。
第二种方法尝试将Stream<double[]>
转换为一维数组。 toArray
只能将Stream<SomeType>
转换为SomeType[]
。因此,如果SomeType
已经是一维数组,那么toArray
只能产生一个二维数组。
由于第二种方法应创建一维数组,因此应将Stream<String>
映射到DoubleStream
,然后转换为一维数组:
public static double[] DoubleArrayFromFile(String input) throws IOException
{
Path path = Paths.get(input);
return Files.lines(path)
.mapToDouble(Double::parseDouble)
.toArray();
}
顺便说一句,第一种方法也可以简化。没有必要创建单个元素的Stream
只是将其转换为单个double的数组。您可以编写:
public static double[][] Double2DMatrixFromFile(String input) throws IOException
{
Path path = Paths.get(input);
return Files.lines(path)
.map(x -> new double[]{Double.parseDouble(x)})
.toArray(double[][]::new);
}