如果代码中有整数类型值"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);
这不起作用,因为在int
和Double
之间没有定义自动装箱转换。
从JLS 5.1.7开始:
具体来说,以下九种转换称为装箱转换:
- 从布尔类型到布尔类型
- 从字节类型到字节类型
- 从短型到短型
- 从字符类型到字符类型
- 从 int 类型到整数类型
- 从长型到长型
- 从浮点型到浮点型
- 从双倍型到双型
- 从空类型到空类型
因此,1
被装箱到Integer
,并且您的流的推断类型与盒装类型Integer
和Double
:Number & 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);
从手机回答。很抱歉没有结构化的答案,但我认为它有帮助。