为什么整数类型无法在 Java8 流 API 中自动转换为双精度类型?



如果代码中有整数类型值"4"有问题,如果将"4"更改为"4.0",没关系。我以为整数类型可以自动转换为双精度类型,但事实并非如此。那么我以前的代码有什么问题呢?

如果下面的代码中有整数类型"4",则会发生如下错误:

不兼容类型:数字和可比>不能转换为双倍。

double minValue   = Stream.of(4, 0.1).reduce(Double.MAX_VALUE, Double::min);

但是如果我将"4"更改为双类型"4.0",它效果很好。

double minValue   = Stream.of(4.0, 0.1).reduce(Double.MAX_VALUE, Double::min);

这不起作用,因为在intDouble之间没有定义自动装箱转换。

从JLS 5.1.7开始:

具体来说,以下九种转换称为装箱转换:

  • 从布尔类型到布尔类型
  • 从字节类型到字节类型
  • 从短型到短型
  • 从字符类型到字符类型
  • 从 int 类型到整数类型
  • 从长型到长型
  • 从浮点型到浮点型
  • 从双倍型到双型
  • 从空类型到空类型

因此,1被装箱到Integer,并且您的流的推断类型与盒装类型IntegerDoubleNumber & Comparable<?>匹配。(从技术上讲,这是类型的最小上限)

相反,您要么需要自己显式地将int框(Double.valueOf(1)),要么将其强制转换为double((double) 1),或者将其指定为双文本(1.0)。

这很简单。对于流,您输入了一个整数数字。因此,当您尝试将其设置为双倍时,它会显示错误。

但是,在第二个示例中,您给出了双倍作为输入,因此可以毫无错误地输出。

请参阅下面的位复杂结构(2D 数组)中的一个数组和流说明

double[][] doubleArray = Arrays.stream(intArray)
.map(arr -> Stream.of(arr).mapToDouble(Number::doubleValue).toArray())
.toArray(double[][]::new);

这可以分解如下:

首先,使用Arrays.stream创建一个Stream<Number[]>。然后对于每个Number[],你创建一个Stream<Number>,并使用mapToDouble来获取DoubleStream,然后toArray()来获取double[]数组。

最后一个toArray调用将此Stream<double[]>转换为double[][]数组。

现在是您的代码。

DoubleStream stream1 =     Stream.of(4, 0.1).mapToDouble(num -> (doub b le)num);
stream1.forEach(System.out::println);

从手机回答。很抱歉没有结构化的答案,但我认为它有帮助。

相关内容

  • 没有找到相关文章

最新更新