[英]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
因為DoubleStream
的max()
返回一個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.max
和DoubleStream.min
方法的返回類型,它是OptionalDouble
(而不是double
),因為流可能是空的,在這種情況下,既沒有max值也沒有min值。 在這種情況下,返回的OptionalDouble
實例將為空。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.