ReduceOps.makeRef的源代码中return语句之后的这段代码是做什么的?

时间:2018-07-10 02:24:36

标签: java java-stream

jdk8u source code for the ReduceOps class中,第155-190行(如下所示)构成makeRef方法:

public static <T, I> TerminalOp<T, I>
makeRef(Collector<? super T, I, ?> collector) {
    Supplier<I> supplier = Objects.requireNonNull(collector).supplier();
    BiConsumer<I, ? super T> accumulator = collector.accumulator();
    BinaryOperator<I> combiner = collector.combiner();
    class ReducingSink extends Box<I>
            implements AccumulatingSink<T, I, ReducingSink> {
        @Override
        public void begin(long size) {
            state = supplier.get();
        }

        @Override
        public void accept(T t) {
            accumulator.accept(state, t);
        }

        @Override
        public void combine(ReducingSink other) {
            state = combiner.apply(state, other.state);
        }
    }
    return new ReduceOp<T, I, ReducingSink>(StreamShape.REFERENCE) {
        @Override
        public ReducingSink makeSink() {
            return new ReducingSink();
        }

        @Override
        public int getOpFlags() {
            return collector.characteristics().contains(Collector.Characteristics.UNORDERED)
                   ? StreamOpFlag.NOT_ORDERED
                   : 0;
        }
    };
}

我明确询问第177-189行:

    return new ReduceOp<T, I, ReducingSink>(StreamShape.REFERENCE) {
        @Override
        public ReducingSink makeSink() {
            return new ReducingSink();
        }

        @Override
        public int getOpFlags() {
            return collector.characteristics().contains(Collector.Characteristics.UNORDERED)
                   ? StreamOpFlag.NOT_ORDERED
                   : 0;
        }
    };

return语句后的代码有什么作用(为什么它不可达)?我猜想它正在执行某些操作,例如从称为ReduceOp的接口重写某些方法,但是看来这样的接口(如果存在)与many of the other relevant interfaces不在同一位置。

1 个答案:

答案 0 :(得分:-1)

  

为什么不可达

这就是所谓的三元运算符。它会评估条件,在这种情况下,characteristics是否包含UNORDERED标志,在这种情况下,它将返回NOT_ORDERED op标志。否则,如果条件为假(当characteristics 包含UNORDERED标志时,它将仅返回0。