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

时间:2018-08-16 10:26:49

标签: java arrays java-8 java-stream

我已经审查了“可能相关”的问题,但是它们似乎没有帮助;我也是一个初学者,尤其是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

鉴于这种情况在第一种情况下仍然有效,因此我不清楚该不兼容的地方。

很抱歉,这似乎很明显,但是我对编码非常陌生。

1 个答案:

答案 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);

}