Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

ゆるふわJava8入門
1
BizReach
Product Marketing
Lead Engineer
Takanori Sotsuka
2015/05/27

誰?
2
・元SIer勤務
・今はビズリーチのサービス開発、運用担当のエンジニア
・Javaとは1.3からのおつきあい
・趣味はロードバイク
・週末は多摩川・奥多摩近辺に生息

D3(ディーキューブ)とは?
3
創業以来、高い技術力と戦略的なUI/UXを武
器に、世の中に価値あるサービスを生み出し
ているビズリーチ。サービスの数が増えるに
つれ、技術の幅が広がったため、そのスキル
やノウハウを社内のみならず、世の中...

Agenda
1.Lambda式とStream API
2.Optional
3.Default Methods
4

Lambda式とStream API
5

Stream
Streamとは?
6
・パイプライン形式のAPI
・Stream内の処理の記述はLambda式で記載する。
・それぞれの処理を分割して記載できる。
・メソッドチェーンにて記載できる。

for文
Stream
概念-パイプライン(今まで)
データの取得
条件抽出
データの加工 データの集計
7

Stream
概念-パイプライン(Stream)
データの
取得
条件抽出
データの
加工
データの
集計
ソース 中間操作 終端操作
8

Stream
概念-パイプライン(Stream)
9
List<String> addrList = list.stream()
.filter(person -> person.getAge() >= 20)
.map(person ->...

Stream
概念-遅延評価(for文)
中間操作
5処理
中間操作
3処理
終端処理
1処理
10

Stream
概念-遅延評価(Stream)
中間操作
3処理
中間操作
1処理
終端処理
1処理
11

Stream
概念-並列処理
中間操作
3処理
中間操作
1処理
終端処理
1処理
12

Stream
Lambda-書き方
List<String> list = Arrays.asList("Java", "JavaScript", "C#", ”HTML");
// Java7
for (String s : list) ...

Stream
Lambda-書き方
List<String> list = Arrays.asList("Java", "JavaScript", "C#", ”HTML");
list.forEach((final String s) -...

Stream
Filter
List<String> list = Arrays.asList("Java", "JavaScript", "C#", "HTML");
list.stream().filter(s -> s.length(...

Stream
Filter-Predicate
Lambdaをそのまま書いた場合
List<String> list = Arrays.asList("aaa", "bbb", "ccc");
public void printCount(...

Stream
Filter-Predicate
Lambdaを関数化した場合①
List<String> list = Arrays.asList("aaa", "bbb", "ccc");
public void printCount(L...

Stream
Filter-Predicate
Lambdaを関数化した場合②
public void printCount(List<String> list) {
long count =
list.stream().filter(st...

Stream
Filter-Predicate
Lambdaを関数化した場合③
public void printCount(List<String> list) {
long count =
list.stream().filter(st...

Stream
Filter-Predicate
Lambdaを関数化した場合④
public void printCount(List<String> list) {
long count =
list.stream().filter(st...

Stream
Filter-どの書き方がいいの?
無理にFunctionを使う必要はないかなと思う。
1linerでかけるならそのままで、
メソッド参照つかえるならその方が理解しやすいかと。
ただ、他の人のソースを読んだりすることもあるので...

Stream
Map
22
List<String> collect =
list.stream()
.map(person -> person.getFirstName() +person.getLastName())
.collect(...

Stream
ForEach
23
List<String> collect =
list.stream()
.map(person -> person.getFirstName() +person.getLastName())
.forE...

Stream
FlatMap
24
Listの中のListを操作したい場合に有効なMethod
List<String> list = Arrays.asList("a&b", "c&d", ”ef”);
list.stream()
.fl...

Stream
Optionalな戻り値
25
1件目取得や、集計関数を使った場合
戻り値がOptional型で返却される。
値がない場合はemptyとなる。
Optional<String> first = list.stream().fi...

Stream
FileIO-Java7
26
// Java7
try (FileReader fr = new FileReader(path);
BufferedReader br = new BufferedReader(fr)) {...

Stream
FileIO-Java8
27
// Java8
try (FileReader fr = new FileReader(path);
BufferedReader br = new BufferedReader(fr);
S...

Stream
FileIO-Java8
28
// Files#readAllLinesを使った呼び方
try(Stream<String> stream =
Files.readAllLines(Paths.get(path)).stre...

Stream
並列処理
29
stream()をparallelStream()にするだけ
list.stream().forEach(System.out::println);
↓
list.parallelStream().forEac...

Stream
並列処理-全部並列処理したほうが速いんじゃ?
30
そんなことない!
list.parallelStream()の内部ではfork/joinでスレッド化
しているので、fork/joinのコストがかかります。
業務的によく使う...

Stream
例外処理
31
try {
list.stream().forEach(s -> {
if("hoge".equals(s)) {
throw new IllegalArgumentException(“forEach de ...

Stream
Runtime以外の例外処理
32
list.stream().forEach(s -> {
if("hoge".equals(s)) {
try {
throw new Exception("forEach
de Excep...

Stream
並列処理での例外処理
33
try {
List<String> list = Arrays.asList("a", "b", "c", "d", "c", "e", "f");
list.parallelStream().f...

Stream
fork/join frameworkの補足
34
ForkJoinTask
Join Join
Join
Fork Fork
Fork
ChildForkJoinTaskChildForkJoinTask
ChildFork...

Stream
まとめ
35
メリット
・for文よりも簡素に表現できる。
・並列処理も簡単に書ける。
・メソッド参照が便利
デメリット
・例外処理はそんなに得意ではない。
その他
・実行速度はそんなにfor文と変わらない。
・実質的fina...

Stream
ところでfor文は駆逐できるの?
36
ほとんど駆逐できそうだけどちょっと残りそうかな。。。
なのでルールがあればいいと思う。
・基本的にはstreamを使う。
・lambdaはメソッド参照が使えるので積極的に使う。
(既存資...

すこし小ネタ
Mapに追加されたメソッドたち
37
#getOrDefault
Map<String, String> map = new HashMap<>();
map.put("key1", "val1");
map.put("key...

すこし小ネタ
Mapに追加されたメソッドたち
38
#forEach
Map<String, String> map = new HashMap<>();
map.put("key1", "val1");
map.put("key2", "...

Optional
39

Optional
書き方
40
Optionalのインスタンス生成
Optional<String> strOpt = Optional.of("Java");
System.out.println(strOpt.get());
インスタン...

Optional
書き方-null-NullPointerException
41
Optionalのnullで生成した場合の挙動
try {
Optional<String> nullOpt = Optional.of(null);
Sy...

Optional
書き方-null-nullを許容するオブジェクト
42
Optionalのnullの可能性があるオブジェクトで生成したい場合
Optional<Object> nullableOpt = Optional.ofNullab...

Optional
書き方-Empty
43
空のOptionalの生成
Optional<String> emptyOpt = Optional.empty();
try {
System.out.println(emptyOpt.get(...

Optional
書き方-Empty-条件分岐
44
Optionalから値がある場合のみ処理する
Optional<String> emptyOpt = Optional.empty();
if(emptyOpt.isPresent())...

Optional
書き方-Empty-条件分岐
45
Optionalの値がなかった場合の処理
Optional<String> emptyOpt = Optional.empty();
System.out.println(emptyOp...

Optional
書き方-Empty-条件分岐
46
Optionalの値がなかった場合に任意の例外を発生したい場合
Optional<String> emptyOpt = Optional.empty();
try {
emptyOpt....

Optional
アンチパターン
47
やってしまいがちな実装
//Java7
String str = null;
If(str != null) {
System.out.println(str);
}
//Java8
Optional...

Optional
アンチパターンの解決策
48
できるかぎりifPresentを使いましょう。
Optional<String> emptyOpt = Optional. ofNullable(str);
emptyOpt.ifPresen...

Optional
書き方-プリミティブ専用の型
49
プリミティブ型には専用のOptionalがあります。
int型 OptionalInt
long型 OptionalLong
double型 OptionalDouble
それぞれ値の取...

Optional
まとめ
50
すべてOptionalにしたらいいというわけではない。
・その値や戻り値にnullがあることをソースレベルで
表現できることに価値がある。
・isPresent+getはあまり今までと変わらないので
使わない...

Optional
こいつはどうしたら。。。
51
Optional<String> strOpt = Optional.of("");
strOpt.ifPresent(s ->{
if(!s.isEmpty()) {
// 処理実行
}
...

すこし小ネタ
文字列操作
52
List<String> list = Arrays.asList("Java", "JavaScript", "C#", "HTML");
// 文字結合(カンマ区切りで結合したい)
System.out....

すこし小ネタ
Comparator
53
// 昇順
Arrays.sort(array, (s1, s2) -> s1.compareTo(s2));
// 降順
Arrays.sort(array, (s1, s2) -> s2.com...

Default Methods
54

Default Methods
Default Methodsとは?
55
インターフェースに実装を持てるようになります。
多重継承みたいなことができるようになります。

Default Methods
クラス図
56
<<interface>>
Foo
+execute
<<interface>>
Bar
+execute
具象クラス
Impl
次のクラスを例にとって考えてみましょう。

Default Methods
書き方
57
public interface Foo {
default void execute() {
System.out.println("Foo");
}
}
public interface B...

Default Methods
書き方
58
public class Impl implements Foo, Bar {
public static void main(String[] args) {
Impl impl = new ...

Default Methods
書き方-多重継承-優先順位が判断できない場合
59
public class Impl implements Foo, Bar {
public static void main(String[] args)...

Default Methods
クラス図
60
<<interface>>
Foo
+execute
<<interface>>
Bar
具象クラス
Impl
次のクラスを例にとって考えてみましょう。
<<interface>>
Paren...

Default Methods
書き方-多重継承-優先順位が判断できる場合
61
public interface Parent {
default void execute() {
System.out.println("Parent")...

Default Methods
書き方-多重継承-優先順位が判断できる場合
62
public class Impl implements Foo, Bar {
public static void main(String[] args) ...

Default Methods
AbstractClassとの違い
63
InterFace
多重継承できる。
グローバル変数が持てない。
AbstractClass
多重継承できない。
グローバル変数が持てる。

Default Methods
まとめ
64
インターフェースのメソッドの追加は、
インターフェースを実装しているクラスに影響を与えるが、
Default Methodsの登場により、
既存のInterFaceに互換性を保ちながら追加できる!

まとめ
65
・Java8の登場によってJavaに関数型が登場しました。
すべての実装を関数型にすべきだとは思いませんが、
オブジェクト指向、関数型のそれぞれのいいところを
とりつつ開発していくのがいいかと思います。
・Java9の到来を待...

参考資料
66
http://www.amazon.co.jp/Java%E3%81%AB%E3%82%88%E3%82
%8B%E9%96%A2%E6%95%B0%E5%9E%8B%E3%83%97%E3%83
%AD%E3%82%B0%...

【PR】最後に
67
BizReachでは自社サービスを成長させていきたい
エンジニアをお待ちしております!
http://www.bizreach.co.jp/recruit/
Upcoming SlideShare
Loading in …5
×

of

ゆるふわJava8入門 Slide 1 ゆるふわJava8入門 Slide 2 ゆるふわJava8入門 Slide 3 ゆるふわJava8入門 Slide 4 ゆるふわJava8入門 Slide 5 ゆるふわJava8入門 Slide 6 ゆるふわJava8入門 Slide 7 ゆるふわJava8入門 Slide 8 ゆるふわJava8入門 Slide 9 ゆるふわJava8入門 Slide 10 ゆるふわJava8入門 Slide 11 ゆるふわJava8入門 Slide 12 ゆるふわJava8入門 Slide 13 ゆるふわJava8入門 Slide 14 ゆるふわJava8入門 Slide 15 ゆるふわJava8入門 Slide 16 ゆるふわJava8入門 Slide 17 ゆるふわJava8入門 Slide 18 ゆるふわJava8入門 Slide 19 ゆるふわJava8入門 Slide 20 ゆるふわJava8入門 Slide 21 ゆるふわJava8入門 Slide 22 ゆるふわJava8入門 Slide 23 ゆるふわJava8入門 Slide 24 ゆるふわJava8入門 Slide 25 ゆるふわJava8入門 Slide 26 ゆるふわJava8入門 Slide 27 ゆるふわJava8入門 Slide 28 ゆるふわJava8入門 Slide 29 ゆるふわJava8入門 Slide 30 ゆるふわJava8入門 Slide 31 ゆるふわJava8入門 Slide 32 ゆるふわJava8入門 Slide 33 ゆるふわJava8入門 Slide 34 ゆるふわJava8入門 Slide 35 ゆるふわJava8入門 Slide 36 ゆるふわJava8入門 Slide 37 ゆるふわJava8入門 Slide 38 ゆるふわJava8入門 Slide 39 ゆるふわJava8入門 Slide 40 ゆるふわJava8入門 Slide 41 ゆるふわJava8入門 Slide 42 ゆるふわJava8入門 Slide 43 ゆるふわJava8入門 Slide 44 ゆるふわJava8入門 Slide 45 ゆるふわJava8入門 Slide 46 ゆるふわJava8入門 Slide 47 ゆるふわJava8入門 Slide 48 ゆるふわJava8入門 Slide 49 ゆるふわJava8入門 Slide 50 ゆるふわJava8入門 Slide 51 ゆるふわJava8入門 Slide 52 ゆるふわJava8入門 Slide 53 ゆるふわJava8入門 Slide 54 ゆるふわJava8入門 Slide 55 ゆるふわJava8入門 Slide 56 ゆるふわJava8入門 Slide 57 ゆるふわJava8入門 Slide 58 ゆるふわJava8入門 Slide 59 ゆるふわJava8入門 Slide 60 ゆるふわJava8入門 Slide 61 ゆるふわJava8入門 Slide 62 ゆるふわJava8入門 Slide 63 ゆるふわJava8入門 Slide 64 ゆるふわJava8入門 Slide 65 ゆるふわJava8入門 Slide 66 ゆるふわJava8入門 Slide 67
Upcoming SlideShare
関数型プログラミング入門 for Matlab ユーザー
Next
Download to read offline and view in fullscreen.

8 Likes

Share

Download to read offline

ゆるふわJava8入門

Download to read offline

2015/05/27
ゆるふわJava8入門の資料

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

ゆるふわJava8入門

  1. 1.  ゆるふわJava8入門 1 BizReach Product Marketing Lead Engineer Takanori Sotsuka 2015/05/27
  2. 2.  誰? 2 ・元SIer勤務 ・今はビズリーチのサービス開発、運用担当のエンジニア ・Javaとは1.3からのおつきあい ・趣味はロードバイク ・週末は多摩川・奥多摩近辺に生息
  3. 3.  D3(ディーキューブ)とは? 3 創業以来、高い技術力と戦略的なUI/UXを武 器に、世の中に価値あるサービスを生み出し ているビズリーチ。サービスの数が増えるに つれ、技術の幅が広がったため、そのスキル やノウハウを社内のみならず、世の中のエン ジニアやデザイナーとも共有すべく、私たち は「D3(ディーキューブ)※」というプロ ジェクトチームを立ち上げました。 D3では、たくさんのイベントや勉強会を開催 し、世のエンジニア・デザイナーと共に、さ らなる高みを目指します。 ※D3=DESIGNER DEVELOPER DIVISION http://dcube.io/
  4. 4.  Agenda 1.Lambda式とStream API 2.Optional 3.Default Methods 4
  5. 5.  Lambda式とStream API 5
  6. 6.  Stream Streamとは? 6 ・パイプライン形式のAPI ・Stream内の処理の記述はLambda式で記載する。 ・それぞれの処理を分割して記載できる。 ・メソッドチェーンにて記載できる。
  7. 7.  for文 Stream 概念-パイプライン(今まで) データの取得 条件抽出 データの加工 データの集計 7
  8. 8.  Stream 概念-パイプライン(Stream) データの 取得 条件抽出 データの 加工 データの 集計 ソース 中間操作 終端操作 8
  9. 9.  Stream 概念-パイプライン(Stream) 9 List<String> addrList = list.stream() .filter(person -> person.getAge() >= 20) .map(person -> person.getName()) .collect(Collectors.toList()); ソース 中間処理 終端処理
  10. 10.  Stream 概念-遅延評価(for文) 中間操作 5処理 中間操作 3処理 終端処理 1処理 10
  11. 11.  Stream 概念-遅延評価(Stream) 中間操作 3処理 中間操作 1処理 終端処理 1処理 11
  12. 12.  Stream 概念-並列処理 中間操作 3処理 中間操作 1処理 終端処理 1処理 12
  13. 13.  Stream Lambda-書き方 List<String> list = Arrays.asList("Java", "JavaScript", "C#", ”HTML"); // Java7 for (String s : list) { System.out.println(s); } // Java8 list.forEach(System.out::println); 13 メソッド参照
  14. 14.  Stream Lambda-書き方 List<String> list = Arrays.asList("Java", "JavaScript", "C#", ”HTML"); list.forEach((final String s) -> System.out.println(s)); ↓ list.forEach((s) -> System.out.println(s)); ↓ list.forEach(s -> System.out.println(s)); ↓ list.forEach(System.out::println); 14 どの記述方式でも実行可能
  15. 15.  Stream Filter List<String> list = Arrays.asList("Java", "JavaScript", "C#", "HTML"); list.stream().filter(s -> s.length() > 3) .forEach(System.out::println); 出力結果 Java JavaScript HTML 15
  16. 16.  Stream Filter-Predicate Lambdaをそのまま書いた場合 List<String> list = Arrays.asList("aaa", "bbb", "ccc"); public void printCount(List<String> list) { long count = list.stream().filter(s -> s.startsWith("a")).count(); System.out.println(count); } 16
  17. 17.  Stream Filter-Predicate Lambdaを関数化した場合① List<String> list = Arrays.asList("aaa", "bbb", "ccc"); public void printCount(List<String> list) { final Predicate<String> startWithInner = name -> name.startsWith("a"); long count = list.stream().filter(startWithInner).count(); System.out.println(count); } 17
  18. 18.  Stream Filter-Predicate Lambdaを関数化した場合② public void printCount(List<String> list) { long count = list.stream().filter(startsWith.apply("a")).count(); System.out.println(count); } private Function<String, Predicate<String>> startsWith = (String value) -> { Predicate<String> check = (String str) -> { return str.startsWith(value); }; return check; }; 18
  19. 19.  Stream Filter-Predicate Lambdaを関数化した場合③ public void printCount(List<String> list) { long count = list.stream().filter(startsWith.apply("a")).count(); System.out.println(count); } private Function<String, Predicate<String>> startsWith = value -> { Predicate<String> check = str -> str.startsWith(value); return check; }; 19
  20. 20.  Stream Filter-Predicate Lambdaを関数化した場合④ public void printCount(List<String> list) { long count = list.stream().filter(startsWith.apply("a")).count(); System.out.println(count); } private Function<String, Predicate<String>> startsWith = value -> str -> str.startsWith(value); 20
  21. 21.  Stream Filter-どの書き方がいいの? 無理にFunctionを使う必要はないかなと思う。 1linerでかけるならそのままで、 メソッド参照つかえるならその方が理解しやすいかと。 ただ、他の人のソースを読んだりすることもあるので、 こういう書き方もあると知っていることは大事。 21
  22. 22.  Stream Map 22 List<String> collect = list.stream() .map(person -> person.getFirstName() +person.getLastName()) .collect(Collectors.toList()); 値の加工
  23. 23.  Stream ForEach 23 List<String> collect = list.stream() .map(person -> person.getFirstName() +person.getLastName()) .forEach(System.out::println); forEachを使うとある程度何でもできてしまうけど、 Streamのメリットもなくなってくるので乱用は禁物
  24. 24.  Stream FlatMap 24 Listの中のListを操作したい場合に有効なMethod List<String> list = Arrays.asList("a&b", "c&d", ”ef”); list.stream() .flatMap(s -> Arrays.stream(s.split("&"))) .forEach(System.out::println); 出力結果 a b c d ef Stream内で生成される複数のStreamを ひとまとめにしその後の処理を行う。
  25. 25.  Stream Optionalな戻り値 25 1件目取得や、集計関数を使った場合 戻り値がOptional型で返却される。 値がない場合はemptyとなる。 Optional<String> first = list.stream().findFirst(); Optional<String> max = list.stream().max((a,b) -> a.compareTo(b));
  26. 26.  Stream FileIO-Java7 26 // Java7 try (FileReader fr = new FileReader(path); BufferedReader br = new BufferedReader(fr)) { while (br.ready()) { System.out.println(br.readLine()); } } catch (IOException e) { e.printStackTrace(); }
  27. 27.  Stream FileIO-Java8 27 // Java8 try (FileReader fr = new FileReader(path); BufferedReader br = new BufferedReader(fr); Stream<String> stream = br.lines()) { stream.forEach(System.out::println); } catch (IOException e) { e.printStackTrace(); } StreamもAutoCloseableあります。
  28. 28.  Stream FileIO-Java8 28 // Files#readAllLinesを使った呼び方 try(Stream<String> stream = Files.readAllLines(Paths.get(path)).stream();) { stream.forEach(System.out::println); } catch (IOException e) { e.printStackTrace(); }
  29. 29.  Stream 並列処理 29 stream()をparallelStream()にするだけ list.stream().forEach(System.out::println); ↓ list.parallelStream().forEach(System.out::println);
  30. 30.  Stream 並列処理-全部並列処理したほうが速いんじゃ? 30 そんなことない! list.parallelStream()の内部ではfork/joinでスレッド化 しているので、fork/joinのコストがかかります。 業務的によく使う100件程度の処理では通常のstream()のほうが 速かったりします。 例外処理のハンドリングなども考慮する必要があるので、 ご利用は計画的に!
  31. 31.  Stream 例外処理 31 try { list.stream().forEach(s -> { if("hoge".equals(s)) { throw new IllegalArgumentException(“forEach de Exception"); } System.out.println(s); }); }catch(IllegalArgumentException e) { e.printStackTrace(); } RuntimeException以下の サブクラスなら throw可 Streamの外側でもcatch可
  32. 32.  Stream Runtime以外の例外処理 32 list.stream().forEach(s -> { if("hoge".equals(s)) { try { throw new Exception("forEach de Exception"); } catch (Exception e) { e.printStackTrace(); } } System.out.println(s); }); Runtime系以外のExceptionの場合 try/catchで囲んで適切に例外を処理する 必要がある。
  33. 33.  Stream 並列処理での例外処理 33 try { List<String> list = Arrays.asList("a", "b", "c", "d", "c", "e", "f"); list.parallelStream().forEach(s -> { try { if (“c”.equals(s)) { throw new RuntimeException("forEach de Exception"); } } catch (RuntimeException e) { e.printStackTrace(); throw e; } System.out.println(s); }); } catch (Exception e) {e.printStackTrace();} 2回例外処理される 最初の例外のみ処理される
  34. 34.  Stream fork/join frameworkの補足 34 ForkJoinTask Join Join Join Fork Fork Fork ChildForkJoinTaskChildForkJoinTask ChildForkJoinTask
  35. 35.  Stream まとめ 35 メリット ・for文よりも簡素に表現できる。 ・並列処理も簡単に書ける。 ・メソッド参照が便利 デメリット ・例外処理はそんなに得意ではない。 その他 ・実行速度はそんなにfor文と変わらない。 ・実質的finalなこと(メリット/デメリット両方あるかと。)
  36. 36.  Stream ところでfor文は駆逐できるの? 36 ほとんど駆逐できそうだけどちょっと残りそうかな。。。 なのでルールがあればいいと思う。 ・基本的にはstreamを使う。 ・lambdaはメソッド参照が使えるので積極的に使う。 (既存資産の活用がしやすいので。) ・forEachはなるべく使わない。 ・streamの書き方がわからないは甘え。 for文を許可する例 ・例外処理が弱いので、例外処理が複雑になる場合 ・処理が複雑で逆に可読性が下がる場合 ・実質的finalなのでcount++などしたい場合
  37. 37.  すこし小ネタ Mapに追加されたメソッドたち 37 #getOrDefault Map<String, String> map = new HashMap<>(); map.put("key1", "val1"); map.put("key2", "val2"); System.out.println(map.getOrDefault("key1", "default")); System.out.println(map.getOrDefault("key3", "default")); 出力結果 val1 default
  38. 38.  すこし小ネタ Mapに追加されたメソッドたち 38 #forEach Map<String, String> map = new HashMap<>(); map.put("key1", "val1"); map.put("key2", "val2"); map.forEach((k, v) -> { System.out.println("key=" + k + " value=" + v); }); 出力結果 key=key1 value=val1 key=key2 value=val2
  39. 39.  Optional 39
  40. 40.  Optional 書き方 40 Optionalのインスタンス生成 Optional<String> strOpt = Optional.of("Java"); System.out.println(strOpt.get()); インスタンス生成値の取得
  41. 41.  Optional 書き方-null-NullPointerException 41 Optionalのnullで生成した場合の挙動 try { Optional<String> nullOpt = Optional.of(null); System.out.println(nullOpt.get()); } catch (NullPointerException e) { e.printStackTrace(); } インスタンス生成時に NullPointerExceptionが発生
  42. 42.  Optional 書き方-null-nullを許容するオブジェクト 42 Optionalのnullの可能性があるオブジェクトで生成したい場合 Optional<Object> nullableOpt = Optional.ofNullable(null); System.out.println("non Exception"); インスタンス生成時に NullPointerExceptionが発生しない
  43. 43.  Optional 書き方-Empty 43 空のOptionalの生成 Optional<String> emptyOpt = Optional.empty(); try { System.out.println(emptyOpt.get()); } catch (NoSuchElementException e) { e.printStackTrace(); } 空のOptionalの生成 空のOptionalでgetした場合 NoSuchElementExceptionが発生
  44. 44.  Optional 書き方-Empty-条件分岐 44 Optionalから値がある場合のみ処理する Optional<String> emptyOpt = Optional.empty(); if(emptyOpt.isPresent()) { System.out.println(emptyOpt.get()); } emptyOpt.ifPresent(s -> { System.out.println(s); }); 値がないので実行されない
  45. 45.  Optional 書き方-Empty-条件分岐 45 Optionalの値がなかった場合の処理 Optional<String> emptyOpt = Optional.empty(); System.out.println(emptyOpt.orElse(”empty")); System.out.println(emptyOpt.orElseGet(() -> { return "empty"; })); 違う値を返したい場合 違う値をラムダ式で返したい場合
  46. 46.  Optional 書き方-Empty-条件分岐 46 Optionalの値がなかった場合に任意の例外を発生したい場合 Optional<String> emptyOpt = Optional.empty(); try { emptyOpt.orElseThrow(() -> new IllegalStateException()); } catch (IllegalStateException e) { e.printStackTrace(); }
  47. 47.  Optional アンチパターン 47 やってしまいがちな実装 //Java7 String str = null; If(str != null) { System.out.println(str); } //Java8 Optional<String> emptyOpt = Optional. ofNullable(str); if(emptyOpt.isPresent()) { System.out.println(emptyOpt.get()); } isPresent+getは なるべく使わないように。
  48. 48.  Optional アンチパターンの解決策 48 できるかぎりifPresentを使いましょう。 Optional<String> emptyOpt = Optional. ofNullable(str); emptyOpt.ifPresent(s -> { System.out.println(s); });
  49. 49.  Optional 書き方-プリミティブ専用の型 49 プリミティブ型には専用のOptionalがあります。 int型 OptionalInt long型 OptionalLong double型 OptionalDouble それぞれ値の取得などはget()ではなくgetAsInt()のような 専用メソッドがあります。
  50. 50.  Optional まとめ 50 すべてOptionalにしたらいいというわけではない。 ・その値や戻り値にnullがあることをソースレベルで 表現できることに価値がある。 ・isPresent+getはあまり今までと変わらないので 使わないようにしましょう。 ・orElseThrowもなんだか。。。 ・使うならifPresentやorElse,orElseGetを。
  51. 51.  Optional こいつはどうしたら。。。 51 Optional<String> strOpt = Optional.of(""); strOpt.ifPresent(s ->{ if(!s.isEmpty()) { // 処理実行 } }); (ヽ´ω`)ハァ…
  52. 52.  すこし小ネタ 文字列操作 52 List<String> list = Arrays.asList("Java", "JavaScript", "C#", "HTML"); // 文字結合(カンマ区切りで結合したい) System.out.println(list.stream().collect(Collectors.joining(","))); // String.joinでもいけるよ System.out.println(String.join(",", list)); // Stringだけの結合なら System.out.println(String.join("a", "b"));
  53. 53.  すこし小ネタ Comparator 53 // 昇順 Arrays.sort(array, (s1, s2) -> s1.compareTo(s2)); // 降順 Arrays.sort(array, (s1, s2) -> s2.compareTo(s1)); ↓ // 昇順 Arrays.sort(array, Comparator.naturalOrder()); // 降順 Arrays.sort(array, Comparator.reverseOrder());
  54. 54.  Default Methods 54
  55. 55.  Default Methods Default Methodsとは? 55 インターフェースに実装を持てるようになります。 多重継承みたいなことができるようになります。
  56. 56.  Default Methods クラス図 56 <<interface>> Foo +execute <<interface>> Bar +execute 具象クラス Impl 次のクラスを例にとって考えてみましょう。
  57. 57.  Default Methods 書き方 57 public interface Foo { default void execute() { System.out.println("Foo"); } } public interface Bar { default void execute() { System.out.println("Bar"); } }
  58. 58.  Default Methods 書き方 58 public class Impl implements Foo, Bar { public static void main(String[] args) { Impl impl = new Impl(); impl.execute(); } } これだとコンパイルエラーになる。
  59. 59.  Default Methods 書き方-多重継承-優先順位が判断できない場合 59 public class Impl implements Foo, Bar { public static void main(String[] args) { Impl impl = new Impl(); impl.execute(); } @Override public void execute() { Foo.super.execute(); } } 優先順位が判断できない場合 オーバーライドして インターフェース名.super.メソッド名
  60. 60.  Default Methods クラス図 60 <<interface>> Foo +execute <<interface>> Bar 具象クラス Impl 次のクラスを例にとって考えてみましょう。 <<interface>> Parent +execute
  61. 61.  Default Methods 書き方-多重継承-優先順位が判断できる場合 61 public interface Parent { default void execute() { System.out.println("Parent"); } } public interface Foo extends Parent { default void execute() { System.out.println("Foo"); } } public interface Bar extends Parent { // オーバーライドなし }
  62. 62.  Default Methods 書き方-多重継承-優先順位が判断できる場合 62 public class Impl implements Foo, Bar { public static void main(String[] args) { Impl impl = new Impl(); impl.execute(); } } オーバーライドしなくてもコンパイルが通る。 Foo と出力される。
  63. 63.  Default Methods AbstractClassとの違い 63 InterFace 多重継承できる。 グローバル変数が持てない。 AbstractClass 多重継承できない。 グローバル変数が持てる。
  64. 64.  Default Methods まとめ 64 インターフェースのメソッドの追加は、 インターフェースを実装しているクラスに影響を与えるが、 Default Methodsの登場により、 既存のInterFaceに互換性を保ちながら追加できる!
  65. 65.  まとめ 65 ・Java8の登場によってJavaに関数型が登場しました。 すべての実装を関数型にすべきだとは思いませんが、 オブジェクト指向、関数型のそれぞれのいいところを とりつつ開発していくのがいいかと思います。 ・Java9の到来を待ちつつ、Java8を楽しみましょう!
  66. 66.  参考資料 66 http://www.amazon.co.jp/Java%E3%81%AB%E3%82%88%E3%82 %8B%E9%96%A2%E6%95%B0%E5%9E%8B%E3%83%97%E3%83 %AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82 %B0-%E2%80%95Java- 8%E3%83%A9%E3%83%A0%E3%83%80%E5%BC%8F%E3%81%A 8Stream-Venkat- Subramaniam/dp/4873117046/ref=sr_1_47?ie=UTF8&qid=14325513 10&sr=8-47&keywords=Java http://www.amazon.co.jp/Java%E9%80%86%E5%BC%95%E3%81 %8D%E3%83%AC%E3%82%B7%E3%83%94- %E7%AB%B9%E6%B7%BB- %E7%9B%B4%E6%A8%B9/dp/4798122386/ref=sr_1_74?ie=UTF8& qid=1432551409&sr=8-74&keywords=Java
  67. 67.  【PR】最後に 67 BizReachでは自社サービスを成長させていきたい エンジニアをお待ちしております! http://www.bizreach.co.jp/recruit/
  • yoheiM

    Apr. 17, 2016
  • kotainoue5

    Jun. 5, 2015
  • tm8r

    Jun. 3, 2015
  • rensanning

    Jun. 3, 2015
  • yasuakiendo35

    Jun. 1, 2015
  • K2ICE

    May. 30, 2015
  • KanSakamoto

    May. 28, 2015
  • minoruoonuma

    May. 28, 2015

2015/05/27 ゆるふわJava8入門の資料

Views

Total views

3,649

On Slideshare

0

From embeds

0

Number of embeds

497

Actions

Downloads

24

Shares

0

Comments

0

Likes

8

×