比较器<?超级T>作为函数参数-如何使用?

时间:2019-11-26 14:35:42

标签: java comparator

我是初学者。我必须实现一种根据给定比较器查找流的最小和最大元素的方法。如果流中不包含任何元素,请调用:

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));

2 个答案:

答案 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());
        }
    }

它使用流的供应商来创建流的两个实例。