我是初学者。我必须实现一种根据给定比较器查找流的最小和最大元素的方法。如果流中不包含任何元素,请调用:
minMaxConsumer.accept(null, null);
我无法调用:
minMaxConsumer.accept(test.min(order), test.max(order));
代码:
public static <T> void findMinMax(
Stream<? extends T> stream,
Comparator<? super T> order,
BiConsumer<? super T, ? super T> minMaxConsumer) {
Stream<T> test = Stream.concat(Stream.empty(),stream);
if(test.count()==0)
{
minMaxConsumer.accept(null, null);
}
else
{
minMaxConsumer.accept(test.min(order), test.max(order));
}
}
错误:
Compilation error
Main.java:12: error: incompatible types: Optional<T> cannot be converted to CAP#1
minMaxConsumer.accept(test.min(order), test.max(order));
答案 0 :(得分:5)
解开可选项。 test.min(X)
不返回T;它返回一个Optional<T>
。就像在其中一样,它返回一个概念:恰好有一个值,或者没有值。对于空流,当然会出现无值情况。
请注意,即使您解决了该问题,该代码也无法使用; count()操作为“终端”。它消耗流。因此,假设您首先运行计数操作,流将被消耗,并且无法运行最小或最大操作。除此之外,您不能先运行min,然后再运行max(因为这些也是终端操作,运行任何一个都意味着另一个不再需要查看任何元素)。
答案 1 :(得分:0)
如何?
public static void main(String[] args) {
findMinMax(
() -> IntStream.range(1, 100).boxed(),
new NumberComparator(),
(min, max) -> System.out.println("Min : "+ min + " Max " + max)
);
}
public static <T> void findMinMax(
Supplier<Stream<? extends T>> stream,
Comparator<? super T> comparator,
BiConsumer<? super T, ? super T> minMaxConsumer) {
T min = stream.get().min(comparator).orElse(null);
T max = stream.get().max(comparator).orElse(null);
minMaxConsumer.accept(min, max);
}
static class NumberComparator implements Comparator<Number> {
@Override
public int compare(Number o1, Number o2) {
return Double.compare(o1.doubleValue(), o2.doubleValue());
}
}
它使用流的供应商来创建流的两个实例。