获取供应商流的最小值和最大值

时间:2017-11-03 15:11:23

标签: java java-8 double java-stream

我知道我是否使用:

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?

2 个答案:

答案 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.maxDoubleStream.min方法的返回类型,它是OptionalDouble(而不只是double)因为流可能是空的,在这种情况下会有既不是最大也不是最小值。在这种情况下,返回的OptionalDouble实例将为空。