我已经查看了“可能相关”的问题,但它们似乎没有帮助;我也是一个初学者,尤其是 Java8,所以请耐心等待!
问题 - 我想将包含值列表(在本例中为双数字)的文件读入数组。我将这些作为帮助程序类中的方法来执行,因为我预计需要在我的项目中多次执行此操作。
我已经创建了一个简单的方法将文件转换为二维 double 组 -
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);
}
但是这拒绝编译,我不清楚为什么。确切的错误是
Error:(57, 17) java: method toArray in interface java.util.stream.Stream cannot be applied to given types;
required: java.util.function.IntFunction found: double[]::new
reason: inference variable A has incompatible bounds equality constraints: double upper bounds: 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
仅将单个元素转换为单个 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);
}
关于java - 尝试构建一维数组时,推理变量具有不兼容的边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51874855/