在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不在同一位置。
答案 0 :(得分:-1)
为什么不可达
这就是所谓的三元运算符。它会评估条件,在这种情况下,characteristics
是否包含UNORDERED
标志,在这种情况下,它将返回NOT_ORDERED
op标志。否则,如果条件为假(当characteristics
不包含UNORDERED
标志时,它将仅返回0。