java8のstreamをダラダラまとめてみる

28
Java8のStreamを ダラダラまとめる

Upload: mikeneck-mochida

Post on 08-Sep-2014

413 views

Category:

Technology


0 download

DESCRIPTION

Java8のStreamをダラダラまとめてみる

TRANSCRIPT

Page 1: Java8のstreamをダラダラまとめてみる

Java8のStreamを ダラダラまとめる

Page 2: Java8のstreamをダラダラまとめてみる

自己紹介名前:もちださん

Twitter:@mike_neck

Java

Groovy

JavaFX

Gradle

ドラクエ10

Page 3: Java8のstreamをダラダラまとめてみる

今日はなさないことGroovy

JavaFX

Groovy

Gradle

ドラクエ10

Page 4: Java8のstreamをダラダラまとめてみる

今日はなすこと

Stream

とCompletableFutureを少しだけ

Page 5: Java8のstreamをダラダラまとめてみる

本日のサンプルコード

Page 6: Java8のstreamをダラダラまとめてみる

Stream<T>

Listや配列などの集合要素に対して逐次的もしくは並行的に処理を提供するクラス

Page 7: Java8のstreamをダラダラまとめてみる

Collectionとの違いCollection<T> Stream<T>

目的 要素の管理 逐次・並行 処理の提供

各要素へのアクセス 可能

不可能 (可能にする方法もあるにはある)

Page 8: Java8のstreamをダラダラまとめてみる

Stream pipeline

処理をメソッドチェーンで書く

Streamの生成(source)

中間処理(intermediate operation)

終端処理(terminal operation)

Page 9: Java8のstreamをダラダラまとめてみる

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

Page 10: Java8のstreamをダラダラまとめてみる

気をつけたいこと生成元のCollectionが並行処理に対応していない場合、別のスレッドから生成元Collectionを変更すると、Streamの処理が予期しない結果・エラーに繋がる場合がある

Streamは1回使ったら、ふたたび使えない

pipelineは終端処理が呼ばれたら初めて実行される

pipelineの恩恵を受けるためにも一つの処理は短く簡単に書くと良い

Page 11: Java8のstreamをダラダラまとめてみる

Streamの生成 (source)(1)

CollectionからStreamを生成する

Collection#stream()/Collection#parallelStream()

配列からStreamを生成する

Stream.of(Object…)

Page 12: Java8のstreamをダラダラまとめてみる

Streamの生成 (source)(2)

SupplierによってStreamを生成する

Stream.generate(Supplier<T>)

初期値とUnaryOperator(漸化式)によってStreamを生成する

Stream.iterate(T, UnaryOperator<T>)

Page 13: Java8のstreamをダラダラまとめてみる

Streamの生成 (source)(3)

範囲を指定して生成する

IntStream.range(int, int)/LongStream.range…

IntStream.rangeClosed(int, int)/LongSt…

空のStreamを生成する

Stream.empty()

Readerから生成する

BufferedReader#lines()

Page 14: Java8のstreamをダラダラまとめてみる

中間処理(1) (intermediate operation)オブジェクトを変換する

map(Function<T, R>)

mapToInt(ToIntFunction<T>)

要素を選択する

filter(Predicate<T>)

distinct()

Page 15: Java8のstreamをダラダラまとめてみる

中間処理(2) (intermediate operation)要素を選択する(2)

skip(long)

limit(long)

逐次/並行の切り替え

sequential()

parallel()

Page 16: Java8のstreamをダラダラまとめてみる

中間処理(3) (intermediate operation)並び替える

sorted()

sorted(Comparator<T>)

何もしない(デバッグ用)

peek(Consumer<T>)

Page 17: Java8のstreamをダラダラまとめてみる

終端処理(1) (terminal operation)処理をして終了する

forEach(Consumer<T>)

forEachOrdered(Consumer<T>)

数える

count()

Page 18: Java8のstreamをダラダラまとめてみる

終端処理(2) (terminal operation)最大・最小を取得する

max(Comparator<T>)

min(Comparator<T>)

なんか要素を取り出す

findAny()

findFirst()

Page 19: Java8のstreamをダラダラまとめてみる

終端処理(3) (terminal operation)

要素を検証する

allMatch(Predicate<T>)

anyMatch(Predicate<T>)

noneMatch(Predicate<T>)

配列にする

toArray()

toArray(IntFunction<A[]>)

Page 20: Java8のstreamをダラダラまとめてみる

終端処理(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

Page 21: Java8のstreamをダラダラまとめてみる

CompletableFuture

複数のタスクの流れをメソッドチェーンで書ける

Page 22: Java8のstreamをダラダラまとめてみる
Page 23: Java8のstreamをダラダラまとめてみる

「backpaper0 concurrency utilities」で検索

Page 24: Java8のstreamをダラダラまとめてみる

とりまCompletableFuture#runAsync(Runnable, ExecutorService)

ExecutorService上で非同期に走らせる

CompletableFuture#allOf(CompletableFuture<?>…)

すべての処理が完了したら完了する

CompletableFuture#thenRun(Runnable)

次の処理を指定する

Page 25: Java8のstreamをダラダラまとめてみる

int[]からIntStreamを作る

IntStreamでCompletableFuture<Void>[]を作る

値の大きさに比例する処理時間

Queue<Integer>に値を入れる

すべてのCompletableFutureが終了したらQueueから数字を取り出す

Page 26: Java8のstreamをダラダラまとめてみる
Page 27: Java8のstreamをダラダラまとめてみる

_人人人人人人人人人_ > スリープソート < ‾Y^Y^Y^Y^Y^Y^Y^Y‾

Page 28: Java8のstreamをダラダラまとめてみる

おわり