SlideShare a Scribd company logo
1 of 41
Download to read offline
Optionalとは
● java.util.Optional<T>
● ScalaでいうOption
● HaskellでいうMaybe
● 値をもつかもたないか
Optionalを用意する
● 値がある
Optional.of(str)
– nullを渡すとぬるぽ
● 値がない
Optional.empty()
● 値があるかどうかわからない
Optional.ofNullable(str)
値の取得
● get()
– 値がないときNoSuchElementException
● orElse(defaultValue)
– 値がないときdefaultValue
● orElseGet(() -> defaultValue)
– 値がないときにdefaultValue取得処理
● orElseThrow(() -> new Exception())
– 値がないとき例外を生成して投げる
値があるかどうか判定する
if(ostr.isPresent()){
System.out.println(ostr.get());
}
● isPresent
● Java8的ではない
値があるときだけ操作する
● ifPresent
Optional<String> ostr = Optional.of(str);
ostr.ifPresent(s -> {
System.out.println(s.length());
});
別の値に変換する
● map
● flatMap
Optional<String> ostr = Optional.of(str);
ostr.map(String::length)
.ifPresent(System.out::println);
条件に従うものだけ値を使う
● filter
Map<String, String> myMap;
Optional<String> ostr = Optional.of(str);
ostr.filter(s -> s.length() < 5)
.map(s -> myMap.get(s))
.ifPresent(System.out::println);
例
● マシンの管理者の住所が福岡のときにマンション
名の最初5文字を表示。ただし管理者や住所やマ
ンション名はnullのときがある。そのときは空文字
Optional
● マシンの管理者の住所が福岡のときにマンション
名の最初5文字を表示。ただし管理者や住所やマ
ンション名はnullのときがある。そのときは空文字
System.out.println(Optional.of(machine)
.map(m -> m.getAdmin())
.filter(adm -> Optional.ofNullable(adm.getAddr())
.map(adr -> adr.getPref() == 40)
.orElse(false))
.map(adm -> adm.getAddr())
.map(adr -> adr.getMansion())
.map(man -> man.substring(0, 5)
.orElse(“”));
ちょっと使えるイディオム
● foo.execBar()がnullじゃなければその値、nullな
ら違う値
※execBar() はちょっと重い処理
Optional.ofNullable(foo.execBar()).orElse(defValue)
String s = foo.execBar();
if(s == null){
s = defValue;
}
モナド!
● nullのある世界とない世界の分離
● マサカリが飛び交う世界との出会い
– オブジェクト指向->ソフトウェア工学
●
鈍器が飛んでくる
– 関数型->コンピュータ科学
●
するどいマサカリ
nullを使っていいところ悪いところ
●
ローカル変数 ○
– Optionalを使うと安心感はある
●
引数 △
– メソッド利用者に不便がある
– ほとんどの場合はメソッドオーバーロードで対応できる
● 戻り値 ×
– nullを外にもらさない
● フィールド ×
– nullを外にもらさない、もちこまない
Java8のほかの作法
● Streamでの注意
● メソッド参照とラムダの使い分け
● 遅延実行をいかす
● Mapを活用する
● 制御構造を自作する
Streamでの注意
● 副作用に気をつける
● 例外とは相性がわるい
副作用に気をつける
● 副作用を使う基準
– 中間操作 ×
– 終端操作
● reduce △
● forEach ○
例外との相性
● ラムダは関数の世界
● Streamも関数の世界
● 例外はgoto。手続きの世界
● Javaの例外は思想が古い
● 根本的に相性悪い
● 泣く泣くいろいろ対策
– ex:ラッピングメソッドを定義する。
遅延実行をいかす
● 値が使われる可能性の低い引数の構築に時間がか
かるとき
● Logger
● Optional
– Optional#orElseGet
– Optional#orElseThrow
logger.debug(bigObject.toString());
logger.fine(() -> bigObject.toString());
Mapを活用する
● 便利なメソッドが追加されている
– getOrDefault
● Map<?, LIst<?>>が使いやすくなった
● メモ化
Map<?, List<?>>
● 追加
– Map#computeIfAbsent
● 削除
– Map#computeIfPresent
modifiedTuples.computeIfPresent(mt.oldtuple.rid,
(rid, list) -> {
list.remove(mt);
return list.isEmpty() ? null : list;
});
modifiedTuples.computeIfAbsent(mt.oldtuple.rid,
rid -> new LinkedList()).push(mt);
メモ化
● Map#computeIfAbsent
– 値があればその値、なければ計算を行って結果を
Mapに格納しつつ返す。
制御構造を自作する
● カスタムwith
● カスタム分岐
● カスタムループ
カスタムwith
● try-with-resource
public static void withTran(Transaction tx, Runnable proc){
try{
proc.run();
tx.commit();
}catch(Exception ex){
tx.rollback();
}
}
withTran(tx, () -> {
// Databaseアクセス!
});
カスタム分岐
● パターンマッチ
– 型安全なオブジェクトごとの操作と分解
http://d.hatena.ne.jp/nowokay/20131212#1386820115
カスタムループ
● forEach
● zip
zip
● ふたつのStreamをまとめる
● indexを振ったりしたい
Pairとzip
http://d.hatena.ne.jp/nowokay/20140321#1395371615
public static void main(String[] args) {
List<String> prefs = Arrays.asList("ほっかいどう", "ちば",
"とうきょう", "しが", "やまぐち",
"さが", "みやざき");
StreamUtils.zip(
IntStream.iterate(1, SUCC).boxed(),
prefs.stream().filter(s -> s.length() <= 2))
.forEach(p -> System.out.printf(
"%d:%s%n", p.left, p.right));
}
メソッド参照とラムダの使い分け
● メソッド参照は引数を隠す
– events.stream().flatMap(Event::getMember)
.map(Member::getTelephone)
.forEach(tels::add)
●
読み解くのにコンテキスト理解が必要
– メソッドに渡すためのメソッド ○
– 引数ひとつのメソッド △
– 引数複数のメソッド ×
Java8の弱点
● 型推論が案外弱い
http://d.hatena.ne.jp/nowokay/20140107#1389093206
DateTime APIについて
● DateTime APIべんり!
● DateTime APIややこしい!
● DateTime APIめんどくさい!
DateTimeAPIは
● ISO8601の実装
● ISO8601がややこしい!
● ISO8601がめんどくさい!
ISO8601は
● 現実の時間の定義
● 現実の時間がややこしい!
● 現実の時間がめんどくさい!
現実の時間は
●
アウグストゥス
– 神が世界を作る前に時間はあったのか
●
デカルト・ニュートン
– 絶対時間・絶対空間
●
カント
– 時間はア・プリオリ
●
マクタガート
– 時間は実在しない!
●
相対論
– 時間と空間は一緒
●
ハイデガー
– 時間こそ人間の存在論的意味だ!
つまり
● 時間はめんどい
● だからISO8601もめんどい
● だからDate Time APIもめんどい
まとめ
● いろいろ便利
● いろいろめんどい
● 折り合いつけつつ使いましょう

More Related Content

Viewers also liked

モナモナ言うモナド入門
モナモナ言うモナド入門モナモナ言うモナド入門
モナモナ言うモナド入門Masahiro Honma
 
すごいMonad入門
すごいMonad入門すごいMonad入門
すごいMonad入門真一 北原
 
関数型プログラミングとモナド
関数型プログラミングとモナド関数型プログラミングとモナド
関数型プログラミングとモナドMasayuki Isobe
 
循環参照のはなし
循環参照のはなし循環参照のはなし
循環参照のはなしMasahiro Honma
 
Nullのはなし(up用)
Nullのはなし(up用)Nullのはなし(up用)
Nullのはなし(up用)Souki Tanaka
 
JITコンパイルはじめの一歩
JITコンパイルはじめの一歩JITコンパイルはじめの一歩
JITコンパイルはじめの一歩Koichi Sakata
 
AWSを利用する上で考えたいHA構成とAWSを活用した既存DCのバックアップ
AWSを利用する上で考えたいHA構成とAWSを活用した既存DCのバックアップAWSを利用する上で考えたいHA構成とAWSを活用した既存DCのバックアップ
AWSを利用する上で考えたいHA構成とAWSを活用した既存DCのバックアップ真吾 吉田
 
キャッシュコヒーレントに囚われない並列カウンタ達
キャッシュコヒーレントに囚われない並列カウンタ達キャッシュコヒーレントに囚われない並列カウンタ達
キャッシュコヒーレントに囚われない並列カウンタ達Kumazaki Hiroki
 
オプショナル型。 〜 なんとなく付ける ! ? 撲滅
オプショナル型。 〜 なんとなく付ける ! ? 撲滅オプショナル型。 〜 なんとなく付ける ! ? 撲滅
オプショナル型。 〜 なんとなく付ける ! ? 撲滅Tomoki Hasegawa
 
受託開発時におけるAWSクラウド活用術
受託開発時におけるAWSクラウド活用術受託開発時におけるAWSクラウド活用術
受託開発時におけるAWSクラウド活用術Hiroshi Koyama
 
関数型言語とオブジェクト指向言語(序章)
関数型言語とオブジェクト指向言語(序章)関数型言語とオブジェクト指向言語(序章)
関数型言語とオブジェクト指向言語(序章)tadaaki hayashi
 
Seleniumをもっと知るための本の話
Seleniumをもっと知るための本の話Seleniumをもっと知るための本の話
Seleniumをもっと知るための本の話Ryuji Tamagawa
 
アドテク×Scala×パフォーマンスチューニング
アドテク×Scala×パフォーマンスチューニングアドテク×Scala×パフォーマンスチューニング
アドテク×Scala×パフォーマンスチューニングYosuke Mizutani
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門Hideyuki Tanaka
 
磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!Ra Zon
 
ABテスト・LPOのための統計学【社内向けサディスティックエディション】データアーティスト株式会社
ABテスト・LPOのための統計学【社内向けサディスティックエディション】データアーティスト株式会社ABテスト・LPOのための統計学【社内向けサディスティックエディション】データアーティスト株式会社
ABテスト・LPOのための統計学【社内向けサディスティックエディション】データアーティスト株式会社Satoru Yamamoto
 
ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)
ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)
ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)Yuuki Fukuda
 
FINAL FANTASY Record Keeper の作り方
FINAL FANTASY Record Keeper の作り方FINAL FANTASY Record Keeper の作り方
FINAL FANTASY Record Keeper の作り方dena_study
 

Viewers also liked (20)

モナモナ言うモナド入門
モナモナ言うモナド入門モナモナ言うモナド入門
モナモナ言うモナド入門
 
すごいMonad入門
すごいMonad入門すごいMonad入門
すごいMonad入門
 
関数型プログラミングとモナド
関数型プログラミングとモナド関数型プログラミングとモナド
関数型プログラミングとモナド
 
循環参照のはなし
循環参照のはなし循環参照のはなし
循環参照のはなし
 
Nullのはなし(up用)
Nullのはなし(up用)Nullのはなし(up用)
Nullのはなし(up用)
 
JITコンパイルはじめの一歩
JITコンパイルはじめの一歩JITコンパイルはじめの一歩
JITコンパイルはじめの一歩
 
AWSを利用する上で考えたいHA構成とAWSを活用した既存DCのバックアップ
AWSを利用する上で考えたいHA構成とAWSを活用した既存DCのバックアップAWSを利用する上で考えたいHA構成とAWSを活用した既存DCのバックアップ
AWSを利用する上で考えたいHA構成とAWSを活用した既存DCのバックアップ
 
キャッシュコヒーレントに囚われない並列カウンタ達
キャッシュコヒーレントに囚われない並列カウンタ達キャッシュコヒーレントに囚われない並列カウンタ達
キャッシュコヒーレントに囚われない並列カウンタ達
 
オプショナル型。 〜 なんとなく付ける ! ? 撲滅
オプショナル型。 〜 なんとなく付ける ! ? 撲滅オプショナル型。 〜 なんとなく付ける ! ? 撲滅
オプショナル型。 〜 なんとなく付ける ! ? 撲滅
 
受託開発時におけるAWSクラウド活用術
受託開発時におけるAWSクラウド活用術受託開発時におけるAWSクラウド活用術
受託開発時におけるAWSクラウド活用術
 
Monad tutorial
Monad tutorialMonad tutorial
Monad tutorial
 
関数型言語とオブジェクト指向言語(序章)
関数型言語とオブジェクト指向言語(序章)関数型言語とオブジェクト指向言語(序章)
関数型言語とオブジェクト指向言語(序章)
 
Seleniumをもっと知るための本の話
Seleniumをもっと知るための本の話Seleniumをもっと知るための本の話
Seleniumをもっと知るための本の話
 
アドテク×Scala×パフォーマンスチューニング
アドテク×Scala×パフォーマンスチューニングアドテク×Scala×パフォーマンスチューニング
アドテク×Scala×パフォーマンスチューニング
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 
磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!
 
ABテスト・LPOのための統計学【社内向けサディスティックエディション】データアーティスト株式会社
ABテスト・LPOのための統計学【社内向けサディスティックエディション】データアーティスト株式会社ABテスト・LPOのための統計学【社内向けサディスティックエディション】データアーティスト株式会社
ABテスト・LPOのための統計学【社内向けサディスティックエディション】データアーティスト株式会社
 
Chef環境の闇
Chef環境の闇Chef環境の闇
Chef環境の闇
 
ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)
ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)
ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)
 
FINAL FANTASY Record Keeper の作り方
FINAL FANTASY Record Keeper の作り方FINAL FANTASY Record Keeper の作り方
FINAL FANTASY Record Keeper の作り方
 

More from なおき きしだ

GraalVMの紹介とTruffleでPHPぽい言語を実装したら爆速だった話
GraalVMの紹介とTruffleでPHPぽい言語を実装したら爆速だった話GraalVMの紹介とTruffleでPHPぽい言語を実装したら爆速だった話
GraalVMの紹介とTruffleでPHPぽい言語を実装したら爆速だった話なおき きしだ
 
これからのコンピューティングの変化とこれからのプログラミング in 福岡 2018/12/8
これからのコンピューティングの変化とこれからのプログラミング in 福岡 2018/12/8これからのコンピューティングの変化とこれからのプログラミング in 福岡 2018/12/8
これからのコンピューティングの変化とこれからのプログラミング in 福岡 2018/12/8なおき きしだ
 
VRカメラが楽しいのでブラウザで見たくなった話
VRカメラが楽しいのでブラウザで見たくなった話VRカメラが楽しいのでブラウザで見たくなった話
VRカメラが楽しいのでブラウザで見たくなった話なおき きしだ
 
Java新機能観察日記 - JJUGナイトセミナー
Java新機能観察日記 - JJUGナイトセミナーJava新機能観察日記 - JJUGナイトセミナー
Java新機能観察日記 - JJUGナイトセミナーなおき きしだ
 
プログラマになるためになにを勉強するか at 九州学生エンジニアLT大会
プログラマになるためになにを勉強するか at 九州学生エンジニアLT大会プログラマになるためになにを勉強するか at 九州学生エンジニアLT大会
プログラマになるためになにを勉強するか at 九州学生エンジニアLT大会なおき きしだ
 
これからのコンピューティングの変化とこれからのプログラミング at 広島
これからのコンピューティングの変化とこれからのプログラミング at 広島これからのコンピューティングの変化とこれからのプログラミング at 広島
これからのコンピューティングの変化とこれからのプログラミング at 広島なおき きしだ
 
Summary of JDK10 and What will come into JDK11
Summary of JDK10 and What will come into JDK11Summary of JDK10 and What will come into JDK11
Summary of JDK10 and What will come into JDK11なおき きしだ
 
Summary of JDK10 and What will come into JDK11
Summary of JDK10 and What will come into JDK11Summary of JDK10 and What will come into JDK11
Summary of JDK10 and What will come into JDK11なおき きしだ
 
Java10 and Java11 at JJUG CCC 2018 Spr
Java10 and Java11 at JJUG CCC 2018 SprJava10 and Java11 at JJUG CCC 2018 Spr
Java10 and Java11 at JJUG CCC 2018 Sprなおき きしだ
 
New thing in JDK10 even that scala-er should know
New thing in JDK10 even that scala-er should knowNew thing in JDK10 even that scala-er should know
New thing in JDK10 even that scala-er should knowなおき きしだ
 
Java Release Model (on Scala Matsuri)
Java Release Model (on Scala Matsuri)Java Release Model (on Scala Matsuri)
Java Release Model (on Scala Matsuri)なおき きしだ
 
これからのJava言語と実行環境
これからのJava言語と実行環境これからのJava言語と実行環境
これからのJava言語と実行環境なおき きしだ
 
JavaOne2017で感じた、Javaのいまと未来 in 大阪
JavaOne2017で感じた、Javaのいまと未来 in 大阪JavaOne2017で感じた、Javaのいまと未来 in 大阪
JavaOne2017で感じた、Javaのいまと未来 in 大阪なおき きしだ
 
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...なおき きしだ
 
NetBeansのメモリ使用ログから機械学習できしだが働いてるかどうか判定する
NetBeansのメモリ使用ログから機械学習できしだが働いてるかどうか判定するNetBeansのメモリ使用ログから機械学習できしだが働いてるかどうか判定する
NetBeansのメモリ使用ログから機械学習できしだが働いてるかどうか判定するなおき きしだ
 

More from なおき きしだ (20)

GraalVMの紹介とTruffleでPHPぽい言語を実装したら爆速だった話
GraalVMの紹介とTruffleでPHPぽい言語を実装したら爆速だった話GraalVMの紹介とTruffleでPHPぽい言語を実装したら爆速だった話
GraalVMの紹介とTruffleでPHPぽい言語を実装したら爆速だった話
 
GraalVM at Fukuoka LT
GraalVM at Fukuoka LTGraalVM at Fukuoka LT
GraalVM at Fukuoka LT
 
これからのコンピューティングの変化とこれからのプログラミング in 福岡 2018/12/8
これからのコンピューティングの変化とこれからのプログラミング in 福岡 2018/12/8これからのコンピューティングの変化とこれからのプログラミング in 福岡 2018/12/8
これからのコンピューティングの変化とこれからのプログラミング in 福岡 2018/12/8
 
GraalVMについて
GraalVMについてGraalVMについて
GraalVMについて
 
VRカメラが楽しいのでブラウザで見たくなった話
VRカメラが楽しいのでブラウザで見たくなった話VRカメラが楽しいのでブラウザで見たくなった話
VRカメラが楽しいのでブラウザで見たくなった話
 
最近のJava事情
最近のJava事情最近のJava事情
最近のJava事情
 
怖いコードの話 2018/7/18
怖いコードの話 2018/7/18怖いコードの話 2018/7/18
怖いコードの話 2018/7/18
 
Java新機能観察日記 - JJUGナイトセミナー
Java新機能観察日記 - JJUGナイトセミナーJava新機能観察日記 - JJUGナイトセミナー
Java新機能観察日記 - JJUGナイトセミナー
 
プログラマになるためになにを勉強するか at 九州学生エンジニアLT大会
プログラマになるためになにを勉強するか at 九州学生エンジニアLT大会プログラマになるためになにを勉強するか at 九州学生エンジニアLT大会
プログラマになるためになにを勉強するか at 九州学生エンジニアLT大会
 
これからのコンピューティングの変化とこれからのプログラミング at 広島
これからのコンピューティングの変化とこれからのプログラミング at 広島これからのコンピューティングの変化とこれからのプログラミング at 広島
これからのコンピューティングの変化とこれからのプログラミング at 広島
 
Summary of JDK10 and What will come into JDK11
Summary of JDK10 and What will come into JDK11Summary of JDK10 and What will come into JDK11
Summary of JDK10 and What will come into JDK11
 
Summary of JDK10 and What will come into JDK11
Summary of JDK10 and What will come into JDK11Summary of JDK10 and What will come into JDK11
Summary of JDK10 and What will come into JDK11
 
Java10 and Java11 at JJUG CCC 2018 Spr
Java10 and Java11 at JJUG CCC 2018 SprJava10 and Java11 at JJUG CCC 2018 Spr
Java10 and Java11 at JJUG CCC 2018 Spr
 
New thing in JDK10 even that scala-er should know
New thing in JDK10 even that scala-er should knowNew thing in JDK10 even that scala-er should know
New thing in JDK10 even that scala-er should know
 
Java Release Model (on Scala Matsuri)
Java Release Model (on Scala Matsuri)Java Release Model (on Scala Matsuri)
Java Release Model (on Scala Matsuri)
 
これからのJava言語と実行環境
これからのJava言語と実行環境これからのJava言語と実行環境
これからのJava言語と実行環境
 
JavaOne報告2017
JavaOne報告2017JavaOne報告2017
JavaOne報告2017
 
JavaOne2017で感じた、Javaのいまと未来 in 大阪
JavaOne2017で感じた、Javaのいまと未来 in 大阪JavaOne2017で感じた、Javaのいまと未来 in 大阪
JavaOne2017で感じた、Javaのいまと未来 in 大阪
 
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
 
NetBeansのメモリ使用ログから機械学習できしだが働いてるかどうか判定する
NetBeansのメモリ使用ログから機械学習できしだが働いてるかどうか判定するNetBeansのメモリ使用ログから機械学習できしだが働いてるかどうか判定する
NetBeansのメモリ使用ログから機械学習できしだが働いてるかどうか判定する
 

null使ったら負け福岡版