97

Click here to load reader

ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

Embed Size (px)

Citation preview

Page 1: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

ほんとうに便利だった業務で使えるJava SE8 新機能

Vol.01 Apr/11/2015Yuki  FukudaDU,  Rakuten  Inc.http://www.rakuten.co.jp/

Page 2: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

2

Speaker  Profile

Yuki  Fukuda  (福田 雄貴)

Financial  Service  Department,  DU(April,  2011-­)

• Web  Application  Engineer• Team  Manager

Java歴: 会社にはいってから

Page 3: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

Introduction:Java SE8を初めて使った時の話

Page 4: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

4

March,  2014  – Launch!

Java  8  リリースおめでとうございました

Page 5: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

5

ある日の先輩エンジニアとの会話

都合よく降ってくる案件

Senpai Engineer:今度新規Webアプリ構築の話があるんだけど 興味ある?

Fukuda,  Yuki:

あります

Page 6: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

6

その直後の技術管理マネージャーとの会話

選択肢を用意しない交渉

Fukuda,  Yuki:今度 新規のWebアプリ開発案件があるらしいんですけどJava SE8 と Java EE7 でいいですか?

いいですよね?

Technology  Manager:

いいよ

Page 7: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

7

はじまったプロジェクト

n工期

n工数

n人的リソース

約6ヶ月

67人月

なんとかして

Page 8: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

8

ぼくの考えた最強のスケジュール

May June July August September October

要件定義

結合テスト

QA・総合テスト

詳細設計

基本設計

開発・単体テスト

Page 9: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

9

May June July August September October

提示されたスケジュール

要件定義・設計

テスト

QA

開発

念のためテスト

Page 10: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

10

スケジュール上の問題点

1 要件を決める気がない

3 開発より先に念のためテストがある

2 要件を決めている最中に結合テストが始まる

Page 11: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

11

ほんとうに困った問題点

1 要件を決める気がない

3 開発より先に念のためテストがある

2 要件を決めている最中に結合テストが始まる

n人的リソース

なんとかして

Page 12: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

12

3年目の勘

1) この案件は絶対にヤバイ。

2) スーパーエースを全力で投入しないと自分が死ぬ。

Page 13: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

13

所属組織マネージャーとの会話

スーパーエースを全力で投入しないと自分が死ぬ

Fukuda,  Yuki:スーパーエースを10人ください

Group  Manager:おまえは何を言っているんだ

Fukuda,  Yuki:

え?

Page 14: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

14

はじまったプロジェクト(再掲)

n工期

n工数

n人的リソース

約6ヶ月

67人月

なんとかして

Page 15: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

15

所属組織マネージャーとの会話(続き)

表現が良くなかった

Fukuda,  Yuki:普通の人の1.5人分働くヤツを7人ください

Group  Manager:お前が2人分働けば6人で足りるよね

Fukuda,  Yuki:

はい。え?

Page 16: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

16

祝・開発チーム結成

7名のエンジニア確保に成功

※ただし7国籍

↑福田

Page 17: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

17

公用語

俺達には英語がある

Page 18: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

18

朝のあいさつ

現実の会話

Fukuda,  Yuki:早安(中国語)

Engineer:Bonjour(フランス語)

Engineer:おはよー(日本語)

Engineer:moi(フィンランド語)

Engineer:Good morning!(英語)

Page 19: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

19

実際の公用語

Java

Page 20: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

20

果たして本当にそうか!?

理想 現実

コーディング規約 Java SE8に関する規約なし

世の中のスタンダード 探しても見つからない

Java SE8を解析できない※いまはできます

Page 21: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

21

スーパーエースたちは思った

「信じられるのは自分だけだ」

Page 22: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

22

スーパーエースたちは思った

「信じられるのは自分だけだ」

=宗教戦争のはじまり

Page 23: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

23

本日のテーマ

宗教戦争の果てに

僕達が見たもの

Page 24: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

Main  Chapter:ほんとうに便利だった新機能

Page 25: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

(1)Stream  API

Page 26: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

26

Stream  API  -­ for文禁止令

for文禁止※ついでにwhile文も禁止

Page 27: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

27

Stream  API  -­ 問

いかにしてエンジニアを

for文から脱却させるか

Page 28: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

28

Stream  API -­ IDEによる自動変換

自動変換はお手軽だけど

生成されるコードは微妙

Page 29: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

29

Stream  API  -­ やっぱり自分で書こう!

Page 30: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

30

Stream  API  -­ シンプルに教育

1 Streamの始め方

3 Streamの終わり方

2 Streamのつなぎ方

Page 31: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

31

Stream  API  -­ Streamの始め方(1)

Collection#stream()

「forの代わりにstreamって書け」

Page 32: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

32

Stream  API  -­ Streamの始め方(2)

Arrays#stream(T[]  array)

配列から始めるときはこちら

Page 33: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

33

Stream  API  -­ Streamの始め方(3)

Files#lines(Path  path)

ファイル読み書き系のバッチ処理において極めて有能

Page 34: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

34

Stream  API  -­ Streamのつなぎ方(1)

filter(Predicate<?  super T> predicate)

主な用途: Streamを流れるデータのバリデーションデータの絞り込み

Page 35: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

35

Stream  API  -­ Streamのつなぎ方(2)

map(Function<?  super T,  ?  extends  R> mapper)

Page 36: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

36

Stream  API  -­ Streamのつなぎ方(3)

peek(Consumer<?  super T> action)

特にログを吐くときが便利

業務ロジックを動かすときは使わないこと※サンプルには書いていますが仕事では使ってません

Page 37: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

37

Stream  API  -­ Streamの終わり方(1)

よくある事例:CollectionをStreamとして処理したあと、最後にCollectionに戻したい

Page 38: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

38

Stream  API  -­ Streamの終わり方(1)

あまりない事例:StringのStreamをいろいろいじくった最後に結合したい

Page 39: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

39

Stream  API  -­ Streamの終わり方(2)

よくある事例:Streamの各要素をファイルに書き出したい

StreamはAutoCloseableを実装しているのでtry-­with-­resource文のリソースとして利用可能

Page 40: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

40

Stream  API  -­ Streamの終わり方(3)

よくある事例:なんらかの処理をしたあと n番目の要素がほしい

Page 41: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

41

Stream  API  -­ いいわけパート

0 0.0005 0.001 0.0015 0.002 0.0025 0.003 0.0035 0.004 0.0045 0.005

while

for

Statement  /  Step  Count

Java  SE7

Java  SE8

-80% (※当社比)

-85% (※当社比)

Page 42: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

42

Stream  API  -­ いいわけパート

よくある事例:検査例外がうまくさばけなかった

Page 43: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

43

Stream  API  -­ いいわけパート

よくある事例:実質的final制約に負けた

IDEは結構賢いのでStreamへの変換をサジェストしてきません

Page 44: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

44

Stream  API  -­ いいわけパート

あまりない事例:救いようがないほど複雑なロジックだった

Page 45: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

45

Stream  API  -­ まとめ

実プロジェクトではこれらの事例が複合的に襲ってきますのでfor文禁止は弾力的に運用するのがよさそう

「移植したソースを直す時間がないから」「Streamよくわか

らないから」といった理由でfor文を許可するのはダメ

※今回のプロジェクトでの判断基準はラムダ式の -> の右側に{ } が必要になるかどうかにしました

Page 46: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

(2)Method  References

Page 47: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

47

Method  References  -­ Lambdaも悪くないけど…

.filter(string  -­>  string.length()  >  6)ちょっと鬱陶しい(というか仕事でこんなのかきたくない)

Page 48: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

48

Method  References  -­ Lambdaも悪くないけど…

2行以上に渡るラムダ式みたくないネストが深い

Page 49: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

49

Method  References  -­ こっちのほうが馴染みがある

他の外部ライブラリのメソッドとかも使いたい

Page 50: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

50

Method  References  -­ そのまま使おうぜ!

Page 51: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

51

Method  References  -­ Streamをシンプルに

Page 52: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

52

Method  References  -­ メリット

• Streamが見た目シンプルになる

• 今まで使っていたコードをそのまま再利用できる

• 単体テストが簡単になる

Page 53: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

53

Method  References  -­ デメリット

どうみてもそこにいるべきではないコードが出現している

Page 54: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

54

Method  References  -­ 教訓

ちゃんと関数型インタフェースを実装したクラスの作り方を教育すること

※そういうものが存在するっていうことを教えてあげること

Page 55: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

(3)Date  and  Time  API

Page 56: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

56

Date  and  Time  API  -­ java.util.Date禁止令

java.util.Date禁止※もちろんCalendarも禁止

Page 57: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

57

Date  and  Time  API -­ メリット

直感的

Page 58: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

58

Date  and  Time  API  -­ エンジニアが苦しんだ理由

なぜかMay

Page 59: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

59

Date  and  Time  API  -­ 苦しみからの解放

直感的!!

Page 60: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

60

Date  and  Time  API  -­ 加算減算

直感的!!

Page 61: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

61

Date  and  Time  API  -­ うるう年判定 (Before)

_人人人人人人人人人人人人人_> 突然のGregorianCalendar <

 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄

Page 62: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

62

Date  and  Time  API  -­ うるう年判定 (After)

直感的!!

Page 63: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

63

Date  and  Time  API  -­ 和暦 (Before)

ロケールに ja_JP_JPをセットするとJapaneseImperialCalendar のインスタンスを生成する!

Page 64: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

64

Date  and  Time  API  -­ 和暦 (After)

直感的!!

Page 65: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

65

Date  and  Time  API  -­ 実際の運用(1)

ZonedDateTimeインスタンスの取得方法を限定する。

Page 66: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

66

Date  and  Time  API  -­ 実際の運用(2)

java.util.Dateとの相互変換メソッドを提供する

外部ライブラリの都合で泣く泣くjava.util.Dateを使わされるケースが多々有ります

Page 67: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

67

Date  and  Time  API  -­ 実際の運用(3)

DateTimeFormatterも共通で使うものを用意しておく

Page 68: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

68

Date  and  Time  API  -­ 実は。

コード書く人にとってはそんなに便利になっていないのでは。

一理ある

Page 69: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

69

Date  and  Time  API  -­ 我々が真に獲得したもの

• 変なことをすると例外を吐いてくれる• Immutable• スレッドセーフ

• 見た目わかりやすい

という安心感。

Page 70: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

(4)Optional

Page 71: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

71

Optional  -­ nullチェック禁止令

nullチェック禁止

Page 72: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

72

コードレビューの日常

Optional  -­ 良識あるエンジニアによるレビュー

Code  Reviewer:安易にnullを返したらダメです

ちゃんとチェックしてください意図してnullを返す場合はちゃんとコメントに書いてください

Young  Engineer:はい

Page 73: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

73

Optional  -­ レビューの結果

nullを返さないソースコード

nullを返す場合はコメントに書く

Page 74: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

74

Optional  -­ 後日

別の人が新しいロジックを書きました。

Page 75: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

75

コードレビューの日常

Optional  -­ 良識あるエンジニアによるレビュー(2)

Code  Reviewer:そこnullが返ってきても大丈夫ですか

ちゃんとチェックしたほうが良くないですか

Young  Engineer:はい

Page 76: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

76

Optional  -­ レビューの結果(2)

Page 77: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

77

Optional  -­ チェックされていると安心する

とても安全!!

Page 78: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

78

Optional  -­ もうやめよう

人間のやる仕事じゃない

Page 79: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

79

Optional  -­ これからの時代

Optional(nullかもしれない値)

Page 80: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

80

Optional  -­ nullの可能性があることを主張したい

(1)返り値の型をOptionalにする

(2)返す値をOptionalで包む

Page 81: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

81

コードレビューの日常

Optional  -­ これからのレビュー

Code  Reviewer:nullが返る可能性があるのならOptionalで包んでください

Young  Engineer:はい

Page 82: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

82

Optional  -­ nullでないことを保証しなければならない

返す値をOptionalから値を取りだすOptionalが空のときはデフォルト値を返す

Page 83: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

83

コードレビューの日常

Optional  -­ これからのレビュー(2)

Code  Reviewer:返り値がOptionalではないのならnullが返らないように作ってください

Young  Engineer:はい

Page 84: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

84

Optional  -­ ダメな例

Optional#of(T  value)はnullを渡すと NullPointerException が発生します→このメソッドはあまり出番がないです

isPresent()  +  get()  =  やってることがnullチェックと同じ→単純なisPresent()とget()の組み合わせは避けましょう※isPresent()はifPresent()の処理で例外処理を入れたい場合など、

用途を限って使うのが良いと思います。

Page 85: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

85

Optional  -­ プログラマを処刑すべき例

絶対に許さない

Page 86: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

86

Optional  -­ orElse()  orElseGet()

Page 87: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

87

Optional  -­ orElseThrow()

Page 88: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

88

Optional  -­ 利用にあたって

中途半端が一番危険

このルールを適用する範囲を明確にしないとOptionalをちゃんと返すやつとnull返すやつが混在するカオスコード集が完成します

Page 89: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

(5)Others

Page 90: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

90

UncheckedIOException

ご利用は計画的に!!

Page 91: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

91

String#split()

“When  there  is  a  positive-­width  match  at  the  beginning  of  this  string  then  an  empty  leading  substring  is  included  at  the  beginning  of  the  resulting  array.  A  zero-­width  match  at  the  beginning  however  never  produces  such  empty  leading  substring.”

英語版Java  SE8ドキュメントより引用http://docs.oracle.com/javase/8/docs/api/java/lang/String.html

Page 92: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

92

Collection  /  List  /  Map

Streamを使う前に一度確認を!

Page 93: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

Conclusion:まとめ

Page 94: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

94

まとめ

Java  SE8を仕事でつかってみました

いくつかの新機能について思ったことを話しました• Stream  API• Method  References• Date  and  Time  API• Optional• その他

Page 95: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

95

まとめ

• シンプル• 安全• 古いコードもう見たくない

Java  SE8  すてき!

Page 96: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

96

まとめ

Java  SE8を導入して幸せになろう!

※ただし、コーディング規約やポリシーの類は整理が必要

Page 97: ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)

おわり