さっそくですが、クイズです
なんと出力される?
void main() {
var s = Stream.generate(() -> {
IO.print("①");
return 0;
});
IO.print("②");
s = s.limit(1);
s = s.peek(x -> IO.print("③"));
IO.println("④");
s.forEach(x -> IO.print("⑤"));
}
選択肢
1. ① ② ③ ④ ⑤
2. ② ④ ① ③ ⑤
3. ① ② ④ ③ ⑤
4. コンパイルエラー
Slide 3
Slide 3 text
さっそくですが、クイズです
なんと出力される?
void main() {
var s = Stream.generate(() -> {
IO.print("①");
return 0;
});
IO.print("②");
s = s.limit(1);
s = s.peek(x -> IO.print("③"));
IO.println("④");
s.forEach(x -> IO.print("⑤"));
}
選択肢
1. ① ② ③ ④ ⑤
2. ② ④ ① ③ ⑤
3. ① ② ④ ③ ⑤
4. コンパイルエラー
JDKレポジトリ
HotSpot VM
標準クラスライブラリ
ツール
複数のOSをサポート
複数のCPUをサポート
Slide 9
Slide 9 text
No content
Slide 10
Slide 10 text
JDKレポジトリのディレクトリ構成
jdk
......
モジュールごと
OSごと
shareは共通
bin
doc
make
src
test
hotspot
java.base
java.compiler
aix
linux
macosx
share
unix
windows
classes
conf
data
legal
man
native
META-INF
com
java
javax
jdk
sun
パッケージ
ReferencePipeline.reduce()
java.util.stream.ReferencePipeline
@Override
public final P_OUT reduce(
final P_OUT identity,
final BinaryOperator accumulator) {
return evaluate(
ReduceOps.makeRef(identity, accumulator, accumulator));
}
Slide 47
Slide 47 text
ReduceOps.makeRef()
java.util.stream.ReduceOps
public static TerminalOp
makeRef(U seed, BiFunction reducer,
BinaryOperator combiner) {
class ReducingSink extends Box
implements AccumulatingSink {
......
}
return new ReduceOp(StreamShape.REFERENCE)
@Override
public ReducingSink makeSink() {
return new ReducingSink();
}
};}
値を1つ持つコンテナ
ReduceOps.makeRef()
java.util.stream.ReduceOps
public static TerminalOp
makeRef(U seed, BiFunction reducer,
BinaryOperator combiner) {
class ReducingSink extends Box
implements AccumulatingSink {
......
}
return new ReduceOp(StreamShape.REFERENCE)
@Override
public ReducingSink makeSink() {
return new ReducingSink();
}
};}
Slide 50
Slide 50 text
ReferencePipeline.reduce()
java.util.stream.ReferencePipeline
@Override
public final P_OUT reduce(
final P_OUT identity,
final BinaryOperator accumulator) {
return evaluate(
ReduceOps.makeRef(identity, accumulator, accumulator));
}
Slide 51
Slide 51 text
AbstractPipeline.evaluate()
java.util.stream.AbstractPipeline
final R evaluate(TerminalOp 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()));
}
Slide 52
Slide 52 text
ReduceOp.evaluateSequential()
java.util.stream.ReduceOps
@Override
public R evaluateSequential(PipelineHelper helper,
Spliterator spliterator) {
return helper.wrapAndCopyInto(makeSink(), spliterator).get();
}
Slide 53
Slide 53 text
ReduceOps.makeRef()
java.util.stream.ReduceOps
public static TerminalOp
makeRef(U seed, BiFunction reducer,
BinaryOperator combiner) {
class ReducingSink extends Box
implements AccumulatingSink {
......
}
return new ReduceOp(StreamShape.REFERENCE)
@Override
public ReducingSink makeSink() {
return new ReducingSink();
}
};}
Slide 54
Slide 54 text
ReduceOp.evaluateSequential()
java.util.stream.ReduceOps
@Override
public R evaluateSequential(PipelineHelper helper,
Spliterator spliterator) {
return helper.wrapAndCopyInto(makeSink(), spliterator).get();
}
ReducingSink
内部でStatelessOpの
opWrapSinkをコール
Slide 55
Slide 55 text
ReferencePipeline.map()
java.util.stream.ReferencePipeline
public final Stream map(
Function mapper) {
Objects.requireNonNull(mapper);
return new StatelessOp<>(this, StreamShape.REFERENCE,
StreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT) {
@Override
Sink opWrapSink(int flags, Sink sink) {
return new Sink.ChainedReference<>(sink) {
@Override
public void accept(P_OUT u) {
downstream.accept(mapper.apply(u));
}
};
downstream
Slide 56
Slide 56 text
ReduceOp.evaluateSequential()
java.util.stream.ReduceOps
@Override
public R evaluateSequential(PipelineHelper helper,
Spliterator spliterator) {
return helper.wrapAndCopyInto(makeSink(), spliterator).get();
}
ReducingSink
Sinkチェーンを生成