簡體   English   中英

獲取供應商流的最小和最大值

[英]Get min and max of supplier streams

我知道我是否使用:

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?

DoubleStream轉換為Supplier<DoubleStream>不會使DoubleStream成為Supplier<DoubleStream>

您需要一個lambda表達式() -> stream來形成() -> 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

因為DoubleStreammax()返回一個OptionalDouble

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 ),因為流可能是空的,在這種情況下,既沒有max值也沒有min值。 在這種情況下,返回的OptionalDouble實例將為空。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM