은 불가하다.
조금더 구체적으로 말하면
스트림 함수중 내부적으로 reduce()를 호출하는 경우에 불가능하다.
이렇게 설계한 배경은 조금더 찾아봐야 하겠지만
불가능한 이유는 다음과 같다.
IntStream의 sum()의 구현체다
sum() 함수는 다음 순서대로 진행된다.
sum() -> reduce() -> AbstractPiplie.evaluate()
그리고 evaluate함수는 상속받은 AbstractPipeLine에 구현되어있다.
처음 호출되었을때 해당 파이프라인의 linkedOrConsumed 를 true로 변환하고 이후에 호출되었을시
예외처리를 하게끔 되어있다.
조금더 구체적으로 말하면
스트림 함수중 내부적으로 reduce()를 호출하는 경우에 불가능하다.
이렇게 설계한 배경은 조금더 찾아봐야 하겠지만
불가능한 이유는 다음과 같다.
IntStream의 sum()의 구현체다
sum() 함수는 다음 순서대로 진행된다.
sum() -> reduce() -> AbstractPiplie.evaluate()
abstract class IntPipeline<E_IN> extends AbstractPipeline<E_IN, Integer, IntStream> implements IntStream {
....
@Override public final int sum() { return reduce(0, Integer::sum); }...@Override public final int reduce(int identity, IntBinaryOperator op) { return evaluate(ReduceOps.makeInt(identity, op)); }
}
그리고 evaluate함수는 상속받은 AbstractPipeLine에 구현되어있다.
처음 호출되었을때 해당 파이프라인의 linkedOrConsumed 를 true로 변환하고 이후에 호출되었을시
예외처리를 하게끔 되어있다.
abstract class AbstractPipeline<E_IN, E_OUT, S extends BaseStream<E_OUT, S>> extends PipelineHelper<E_OUT> implements BaseStream<E_OUT, S> { private static final String MSG_STREAM_LINKED = "stream has already been operated upon or closed"; private static final String MSG_CONSUMED = "source already consumed or closed";
...
/** * Evaluate the pipeline with a terminal operation to produce a result. * * @param <R> the type of result * @param terminalOp the terminal operation to be applied to the pipeline. * @return the result */final <R> R evaluate(TerminalOp<E_OUT, R> terminalOp) { assert getOutputShape() == terminalOp.inputShape(); if (linkedOrConsumed) throw new IllegalStateException(MSG_STREAM_LINKED); linkedOrConsumed = true; return isParallel() ? terminalOp.evaluateParallel(this, sourceSpliterator(terminalOp.getOpFlags())) : terminalOp.evaluateSequential(this, sourceSpliterator(terminalOp.getOpFlags()));}.
댓글
댓글 쓰기