我知道我是否使用:
double data[][] = new double[n][];
// fill the array
DoubleStream stream = Arrays.stream(data).flatMapToDouble(Arrays::stream);
int max = stream.max().getAsDouble();
DoubleStream stream = Arrays.stream(data).flatMapToDouble(Arrays::stream);
int min = stream.min().getAsDouble();
我将获得流所具有的双倍值的最小值和最大值。
然而,我不知道如何将它变成“供应商”。因为
Supplier<Stream> stream = (Supplier<Stream>) Arrays.stream(data).flatMapToDouble(Arrays::stream);
double max = stream.max().getAsDouble();
double min = stream.min().getAsDouble();
不起作用,Supplier<DoubleStream>
不起作用。
我设法让它与
一起使用Supplier<DoubleStream> stream = () -> Arrays.stream(t).flatMapToDouble(Arrays::stream);
OptionalDouble max = stream.get().max();
OptionalDouble min = stream.get().min();
但为什么流中的值变为OptionalDouble?
答案 0 :(得分:3)
将DoubleStream
投放到Supplier<DoubleStream>
不会使DoubleStream
成为Supplier<DoubleStream>
。
您需要一个lambda表达式() -> stream
来组成流的供应商:
Supplier<DoubleStream> supplier = () -> Arrays.stream(data).flatMapToDouble(Arrays::stream);
然后可以通过以下方式确定最大值:
double max = supplier.get().max().orElse(Double.MIN_VALUE);
// where Double.MIN_VALUE can be any other default 'double' value if max is not present
因为max()
超过DoubleStream
会返回OptionalDouble
。
答案 1 :(得分:0)
Supplier<T>
功能界面只有一个抽象方法:
@FunctionalInterface
public Supplier<T> {
T get();
}
由于它是一个功能接口,您可以使用lambda表达式(或方法引用)来创建Supplier
类型的实例:
Supplier<Integer> supplier = () -> 1;
如果您将Integer
泛型类型更改为DoubleStream
,那么您可以获得所需内容:
Supplier<DoubleStream> supplier = Arrays.stream(data).flatMapToDouble(Arrays::stream);
投射不是魔术:如果您有一个DoubleStream
实例,则不能仅将该实例强制转换为Supplier<DoubleStream>
并期望该投射将神奇地转换为供应商。
尽管如此,我们还不清楚为什么你需要首先从流中获得供应商。
关于DoubleStream.max
和DoubleStream.min
方法的返回类型,它是OptionalDouble
(而不只是double
)因为流可能是空的,在这种情况下会有既不是最大也不是最小值。在这种情况下,返回的OptionalDouble
实例将为空。