10月12日、Java SE 8:ラムダ式 & Stream API 入門セミナーにいってきた!
その内容をメモメモ・・・
年内に資格とると、Tシャツがもらえる
●関数型インターフェースとラムダ式
・なぜラムダ式がはいったのか
JavaSE8:関数型スタイルの処理への対応
背景:CPUアーキテクチャの変化
マルチコア化→並列処理
並列処理を効率化するには、関数スタイルの処理のほうが便利
関数=入力した値に対して必ず同じ結果を返すもの
JavaSE8:関数型インターフェースの導入
オブジェクト指向にはなじみにくい
でも、関数型いいよ
関数をオブジェクトで扱う→関数型インターフェース
→単純化できる
パターンはjava.util.functionパッケージを使う
・関数型インターフェース
単一のabstructメソッドを持つインターフェース(SAMインターフェース)
staticメソッドとデフォルトメソッドはOK
staticメソッド
デフォルトメソッド:デフォルト実装を与える
java.lang.ObjectのpublicメソッドもOK
Java8の新機能
SAM;しんぐるあぶすとらくとめそっど
@functionalInterface をつけると、関数型と思っていることを示す
→そうでなかったら、エラーになる
・ラムダ式の前に
無名クラス:見通し悪い
→ラムダ式導入
ラムダ式
関数型インターフェースを実装するクラスのインスタンスかを簡略化する
ための構文
関数型インターフェースのメソッドにフォーカスして実装を記述できる
メソッド名は書かなくても推論できる
変数Xはどこで宣言している 引数名
ラムダ式は何を簡略化している?
引数リストとメソッドを書けばOK
→バイトコードレベルでは無名クラスとラムダ式は違う
・省略記法
がた省略OK
引数がない場合()
引数1個は括弧省略可能
1行なら中括弧も省略OK
returnも省略OK
ラムダ式のメソッド呼び出しは
System.out::println
でOK
→書き方を決めないと安定しない
コード読みにくくなる
・汎用的な関数スタイルの操作
基本形は5つ
Function
Consumer:void
Supplier:値を返す
Unary(ゆーなりー)Operator:演算
pridicate:ぶーりあんで返す
ひきすう2つの関数型bifunction
●StreamAPI
StreamAPI
データをパイプラインで処理するAPI
Streamの生成
中間操作:遅延評価
終端操作
Streamの作り方
コレクションから
配列から
数値範囲から
任意の要素 Stream.of
IntStreamを使った繰り返し処理
for文を使った繰り返し
IntStreamを使った繰り返し
→for文は並列処理が難しい
並列処理は
.parallel().forEach()とすればいい
→100件とかならfor文のほうが早い
中間操作のためのメソッド
filter
map
flatMap
distinct
peek:なにもしないけど
limit
skipというメソッドもあるので、先頭から何個~何個というのができる
終端操作
forEach
reduce 2つパターン
collect
min/max
count
以下は、ショートサーキット操作(全要素処理しないかも?)
findFirst
findAny
anyMatch
allMatch
noneMatch
※Optionalクラス:JavaSE8から
値がNULLかもしれないコンテナオブジェクト
・StreamAPIの例
Personクラス:年齢50より小さい
カンマ区切で出だす→collectでリダクション処理
101以上200未満の要素の合計を求める:リダクション処理
リダクション処理の考え方
(じつは、IntStreamのmapToInt().sum()でおわる)
IDEは型が違うことしか教えてくれない:何を変えればいいのかは教えない
・コレクションAPIのデフォルトメソッド
removeif predicateの結果をみて、のぞく
●JavaSE8の資格のお話
ゴールドがラムダ式つかえますか?みたいなはなし
今35%オフで受けられる
クレジット決済
オラクルからチケットを買う
その内容をメモメモ・・・
年内に資格とると、Tシャツがもらえる
●関数型インターフェースとラムダ式
・なぜラムダ式がはいったのか
JavaSE8:関数型スタイルの処理への対応
背景:CPUアーキテクチャの変化
マルチコア化→並列処理
並列処理を効率化するには、関数スタイルの処理のほうが便利
関数=入力した値に対して必ず同じ結果を返すもの
JavaSE8:関数型インターフェースの導入
オブジェクト指向にはなじみにくい
でも、関数型いいよ
関数をオブジェクトで扱う→関数型インターフェース
→単純化できる
パターンはjava.util.functionパッケージを使う
・関数型インターフェース
単一のabstructメソッドを持つインターフェース(SAMインターフェース)
staticメソッドとデフォルトメソッドはOK
staticメソッド
デフォルトメソッド:デフォルト実装を与える
java.lang.ObjectのpublicメソッドもOK
Java8の新機能
SAM;しんぐるあぶすとらくとめそっど
@functionalInterface をつけると、関数型と思っていることを示す
→そうでなかったら、エラーになる
・ラムダ式の前に
無名クラス:見通し悪い
→ラムダ式導入
ラムダ式
関数型インターフェースを実装するクラスのインスタンスかを簡略化する
ための構文
関数型インターフェースのメソッドにフォーカスして実装を記述できる
メソッド名は書かなくても推論できる
変数Xはどこで宣言している 引数名
ラムダ式は何を簡略化している?
引数リストとメソッドを書けばOK
→バイトコードレベルでは無名クラスとラムダ式は違う
・省略記法
がた省略OK
引数がない場合()
引数1個は括弧省略可能
1行なら中括弧も省略OK
returnも省略OK
ラムダ式のメソッド呼び出しは
System.out::println
でOK
→書き方を決めないと安定しない
コード読みにくくなる
・汎用的な関数スタイルの操作
基本形は5つ
Function
Consumer:void
Supplier:値を返す
Unary(ゆーなりー)Operator:演算
pridicate:ぶーりあんで返す
ひきすう2つの関数型bifunction
●StreamAPI
StreamAPI
データをパイプラインで処理するAPI
Streamの生成
中間操作:遅延評価
終端操作
Streamの作り方
コレクションから
配列から
数値範囲から
任意の要素 Stream.of
IntStreamを使った繰り返し処理
for文を使った繰り返し
IntStreamを使った繰り返し
→for文は並列処理が難しい
並列処理は
.parallel().forEach()とすればいい
→100件とかならfor文のほうが早い
中間操作のためのメソッド
filter
map
flatMap
distinct
peek:なにもしないけど
limit
skipというメソッドもあるので、先頭から何個~何個というのができる
終端操作
forEach
reduce 2つパターン
collect
min/max
count
以下は、ショートサーキット操作(全要素処理しないかも?)
findFirst
findAny
anyMatch
allMatch
noneMatch
※Optionalクラス:JavaSE8から
値がNULLかもしれないコンテナオブジェクト
・StreamAPIの例
Personクラス:年齢50より小さい
カンマ区切で出だす→collectでリダクション処理
101以上200未満の要素の合計を求める:リダクション処理
リダクション処理の考え方
(じつは、IntStreamのmapToInt().sum()でおわる)
IDEは型が違うことしか教えてくれない:何を変えればいいのかは教えない
・コレクションAPIのデフォルトメソッド
removeif predicateの結果をみて、のぞく
●JavaSE8の資格のお話
ゴールドがラムダ式つかえますか?みたいなはなし
今35%オフで受けられる
クレジット決済
オラクルからチケットを買う