尝试构建一维数组时,推理变量具有不兼容的边界



我已经审查了"可能相关"的问题,但它们似乎没有帮助;我也是一个初学者,特别是Java8,所以请耐心等待!

问题 - 我想将一个包含值列表的文件(在本例中为双精度数字(读取到数组中。 我正在帮助程序类中将这些作为方法执行,因为我希望在我的项目中需要多次执行此操作。

我已经创建了一个简单的方法来将文件转换为 2d 双数组 -

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

这有效,我一直在成功使用它。然后我想尝试将包含一长串大数字的文件读取到 1D 数组中,因此尝试快速修改上面的方法,使其如下所示 -

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[]::新
原因:推理变量 A 具有不兼容的边界 相等约束:双倍 上限:java.lang.Object

我不清楚不兼容在哪里出现,因为它在第一种情况下有效。

抱歉,如果这看起来很明显,但是我对编码很陌生。

你的第一种方法从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只是为了将其转换为单个双精度数组。你可以写:

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

最新更新