Upload
mikeneck-mochida
View
413
Download
0
Embed Size (px)
DESCRIPTION
Java8のStreamをダラダラまとめてみる
Citation preview
Java8のStreamを ダラダラまとめる
自己紹介名前:もちださん
Twitter:@mike_neck
Java
Groovy
JavaFX
Gradle
ドラクエ10
今日はなさないことGroovy
JavaFX
Groovy
Gradle
ドラクエ10
今日はなすこと
Stream
とCompletableFutureを少しだけ
本日のサンプルコード
Stream<T>
Listや配列などの集合要素に対して逐次的もしくは並行的に処理を提供するクラス
Collectionとの違いCollection<T> Stream<T>
目的 要素の管理 逐次・並行 処理の提供
各要素へのアクセス 可能
不可能 (可能にする方法もあるにはある)
Stream pipeline
処理をメソッドチェーンで書く
Streamの生成(source)
中間処理(intermediate operation)
終端処理(terminal operation)
FunctionalInterfaceのおさらい
Supplier<T> () -> TUnaryOperator<T> T -> TBinaryOperator<T> (T, T) -> T
Predicate<T> T -> booleanFunction<T, R> T -> R
BiFunction<T, U, R> (T, U) -> RConsumer<T> T -> Void
BiConsumer<T, U> (T, U) -> Void
気をつけたいこと生成元のCollectionが並行処理に対応していない場合、別のスレッドから生成元Collectionを変更すると、Streamの処理が予期しない結果・エラーに繋がる場合がある
Streamは1回使ったら、ふたたび使えない
pipelineは終端処理が呼ばれたら初めて実行される
pipelineの恩恵を受けるためにも一つの処理は短く簡単に書くと良い
Streamの生成 (source)(1)
CollectionからStreamを生成する
Collection#stream()/Collection#parallelStream()
配列からStreamを生成する
Stream.of(Object…)
Streamの生成 (source)(2)
SupplierによってStreamを生成する
Stream.generate(Supplier<T>)
初期値とUnaryOperator(漸化式)によってStreamを生成する
Stream.iterate(T, UnaryOperator<T>)
Streamの生成 (source)(3)
範囲を指定して生成する
IntStream.range(int, int)/LongStream.range…
IntStream.rangeClosed(int, int)/LongSt…
空のStreamを生成する
Stream.empty()
Readerから生成する
BufferedReader#lines()
中間処理(1) (intermediate operation)オブジェクトを変換する
map(Function<T, R>)
mapToInt(ToIntFunction<T>)
要素を選択する
filter(Predicate<T>)
distinct()
中間処理(2) (intermediate operation)要素を選択する(2)
skip(long)
limit(long)
逐次/並行の切り替え
sequential()
parallel()
中間処理(3) (intermediate operation)並び替える
sorted()
sorted(Comparator<T>)
何もしない(デバッグ用)
peek(Consumer<T>)
終端処理(1) (terminal operation)処理をして終了する
forEach(Consumer<T>)
forEachOrdered(Consumer<T>)
数える
count()
終端処理(2) (terminal operation)最大・最小を取得する
max(Comparator<T>)
min(Comparator<T>)
なんか要素を取り出す
findAny()
findFirst()
終端処理(3) (terminal operation)
要素を検証する
allMatch(Predicate<T>)
anyMatch(Predicate<T>)
noneMatch(Predicate<T>)
配列にする
toArray()
toArray(IntFunction<A[]>)
終端処理(4) (terminal operation)
変換する
reduce(BinaryOperator<T>)
reduce(T, BinaryOperator<T>)
reduce(R, BiFunction<R, T, R>, BinaryOperator<R>)
変換する(mutable reduction)
collect(Collector<T, A, R>) -> R
collect(Supplier<R>, BiConsumer<R, T>, BiConsumer<R, R>) -> R
CompletableFuture
複数のタスクの流れをメソッドチェーンで書ける
「backpaper0 concurrency utilities」で検索
とりまCompletableFuture#runAsync(Runnable, ExecutorService)
ExecutorService上で非同期に走らせる
CompletableFuture#allOf(CompletableFuture<?>…)
すべての処理が完了したら完了する
CompletableFuture#thenRun(Runnable)
次の処理を指定する
int[]からIntStreamを作る
IntStreamでCompletableFuture<Void>[]を作る
値の大きさに比例する処理時間
Queue<Integer>に値を入れる
すべてのCompletableFutureが終了したらQueueから数字を取り出す
_人人人人人人人人人_ > スリープソート < ‾Y^Y^Y^Y^Y^Y^Y^Y‾
おわり