Java SE 8 Lambda & Stream API Overview from History

88
views

Published on

This presentation explain the reason why Lambda expression and Stream API was included in Java SE 8 from the history point of view.

This presentation explain the reason why Lambda expression and Stream API was included in Java SE 8 from the history point of view.

Published in: Technology

0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
88
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
5
Comments
0
Likes
6
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       2   以下の事項は、弊社の一般的な製品の方向性に関する概要を説明するものです。また、 情報提供を唯一の目的とするものであり、いかなる契約にも組み込むことはできません 。以下の事項は、マテリアルやコード、機能を提供することをコミットメント(確約) するものではないため、購買決定を行う際の判断材料になさらないで下さい。オラクル 製品に関して記載されている機能の開発、リリースおよび時期については、弊社の裁量 により決定されます。 OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標です。文中の 社名、商品名等は各社の商標または登録商標である場合があります。 SAFE HARBOR STATEMENT
  • 2. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       プロマネ、アーキテクトのための Java SE 8 活用法 Yoshio Terada Java Evangelist Fusion Middleware Oracle Blog : http://yoshio3.com Twitter : @yoshioterada
  • 3. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       センサー&マイコン   車載   スマート家電&   消費者家電   通信機器   多機能組み込みデバイス   パーソナルデバイス   クラウド・インフラ   企業機関システム  
  • 4. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       5   プロジェクトの成功 成功の為なら古くていい ?! 新しい技術適用の不安 プロマネ
  • 5. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       6   正しいアーキテクチャの選定 必要に応じ新技術のチャレンジ しかし教育コストに対する不安 アーキテクト
  • 6. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       7   Java SE 8 パラダイム・シフト
  • 7. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       8   Java SE 8 に 移行すべきですか?
  • 8. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       9   はい もちろん、すべきです !!
  • 9. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       10   なぜ?
  • 10. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       11   要件 定義 設計 実装 テスト 運用 システムの開発プロセス
  • 11. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       12   要件 定義 設計 実装 テスト 運用 テスト時にパフォーマンス問題発見
  • 12. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       13   Java のせいですか?
  • 13. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       14   ボトルネックの要因は 様々ありますが システム(マルチコア)を 効果的にご利用頂いてますか
  • 14. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       15  
  • 15. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       16   Lambda 式 導入の背景
  • 16. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       17   (Graphic  by  Herb  Sutter)
  • 17. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       18  
  • 18. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       19   Java SE 8 で 並列処理を簡単に
  • 19. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       20   さてここで問題です 「40歳以上の俳優を抽出し  年齢の若い順に出力する  プログラム」 を作成してください。
  • 20. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       List<Actor>  users  =  Arrays.asList(          new  Actor(1,  "岡⽥田",  "准⼀一",      33,  "⼤大阪府"),          new  Actor(2,  "柴⽥田",  "恭兵",      62,  "静岡県"),          new  Actor(3,  "江⼝口",  "洋介",      46,  "東京都"),          new  Actor(4,  "⽵竹中",  "直⼈人",      58,  "神奈奈川県"),          new  Actor(5,  "⾕谷原",  "章介",      41,  "神奈奈川県"),          new  Actor(6,  "春⾵風亭",  "⼩小朝",  59,  "東京都"),          new  Actor(7,  "寺尾",  "聰",          67,  "神奈奈川県"),          new  Actor(8,  "速⽔水",  "もこみち”,  29,  "東京都"),          new  Actor(9,  "⽚片岡",  "鶴太郎郎",    59,  "東京都”));
  • 21. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.              Set<Actor>  actor  =  new  HashSet<>();          for  (Actor  act  :  users)  {                  if  (act.getAge()  >  40)  {                          actor.add(act);                  }          }          List<Actor>  sorted  =  new  ArrayList<>(actor);          Collections.sort(sorted,  new  Comparator<Actor>()  {                  public  int  compare(Actor  a1,  Actor  a2)  {                          return  Integer.compare(a1.getAge(),  a2.getAge());                  }          });          for  (Actor  act  :  sorted)                    System.out.println(act.getFirstName());             条件に一致するデータの抽出 抽出されたデータのソート ソートされたデータの出力
  • 22. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.              Set<Actor>  actor  =  new  HashSet<>();          for  (Actor  act  :  users)  {                  if  (act.getAge()  >  40)  {                          actor.add(act);                  }          }          List<Actor>  sorted  =  new  ArrayList<>(actor);          Collections.sort(sorted,  new  Comparator<Actor>()  {                  @Override                  public  int  compare(Actor  a1,  Actor  a2)  {                          return  Integer.compare(a1.getAge(),  a2.getAge());                  }          });          for  (Actor  act  :  sorted)  {                  System.out.println(act.getFirstName()+act.getLastName());          }   中間処理の結果を保存するためだけ に定義、マルチスレッドで安全 ?
  • 23. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.              Set<Actor>  actor  =  new  HashSet<>();          for  (Actor  act  :  users)  {                  if  (act.getAge()  >  40)  {                          actor.add(act);                  }          }          List<Actor>  sorted  =  new  ArrayList<>(actor);          Collections.sort(sorted,  new  Comparator<Actor>()  {                  @Override                  public  int  compare(Actor  a1,  Actor  a2)  {                          return  Integer.compare(a1.getAge(),  a2.getAge());                  }            });          for  (Actor  act  :  sorted)  {                  System.out.println(act.getFirstName());          }   for 文を2回実行 for 文は逐次処理(並列化困難)
  • 24. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.              Set<Actor>  actor  =  new  HashSet<>();          for  (Actor  act  :  users)  {                  if  (act.getAge()  >  40)  {                          actor.add(act);                  }          }          List<Actor>  sorted  =  new  ArrayList<>(actor);          Collections.sort(sorted,  new  Comparator<Actor>()  {                  @Override                  public  int  compare(Actor  a1,  Actor  a2)  {                          return  Integer.compare(a1.getAge(),  a2.getAge());                  }          });          for  (Actor  act  :  sorted)  {                  System.out.println(act.getFirstName());          }   半年∼1年後に保守 コード・レビューに注意が必要
  • 25. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       Set<Actor>  actor  =  new  HashSet<>();   for  (Actor  act  :  users)  {    if  (act.getAge()  >  40)  {                          actor.add(act);                  }          }          List<Actor>  sorted  =  new  ArrayList<>(actor);          Collections.sort(sorted,  new  Comparator<Actor>()  {                  @Override                  public  int  compare(Actor  a1,  Actor  a2)  {      return  Integer.compare(a1.getAge(),  a2.getAge());                  }          });          for  (Actor  act  :  sorted)  {      System.out.println(act.getFirstName());          }   •  40歳以上の俳優を抽出 •  年齢の若い順ソート •  結果を出力 実装したい内容の確認
  • 26. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       JSR- 337 : Java SE 8 & Stream
  • 27. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       実装したい処理内容に 集中できます
  • 28. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.        users.stream()      .filter(u  -­‐>  u.getAge()  >  40)      .sorted((a1,  a2)  -­‐>  Integer.compare(                                                                a1.getAge(),  a2.getAge()))      .forEach(act  -­‐>  System.out.println(act.getFirstName()));   •  40歳以上の俳優を抽出 → filter •  年齢の若い順ソート → sorted •  結果を出力 → forEach Java SE 8 で実装:一括処理が可能
  • 29. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       次にこれらの処理を 並列化してみましょう
  • 30. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       コレクションに対する並列処理 は Java SE 7 で導入された Fork/Join フレームワークが 利用できます
  • 31. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.              Set<Actor>  actor  =  new  HashSet<>();          for  (Actor  act  :  users)  {                  if  (act.getAge()  >  40)  {                          actor.add(act);                  }          }          List<Actor>  sorted  =  new  ArrayList<>(actor);          Collections.sort(sorted,  new  Comparator<Actor>()  {                  @Override                  public  int  compare(Actor  a1,  Actor  a2)  {                          return  Integer.compare(                                                        a1.getAge(),  a2.getAge());                  }          });          for  (Actor  act  :  sorted)  {                  System.out.println(act.getFirstName());          }   ソート処理部分だけでも並列化してみましょう
  • 32. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       33   import  java.util.Arrays;   import  java.util.List;   import  java.util.concurrent.ForkJoinPool;     public  class  ParallelSort  {            public  static  void  main(String[]  args)  {                  ParallelSort  psort  =  new  ParallelSort();                  ForkJoinPool  pool  =  new  ForkJoinPool();                  List<Actor>  result  =  psort.sort(pool,  user2);                  for(Actor  act  :  result)                          System.out.println(act.getFirstName());          }            protected  List<Actor>  sort(ForkJoinPool  pool,  List<Actor>  numbers)  {                  return  pool.invoke(new  MergeSortTask<>(numbers));          }            List<Actor>  user2  =  Arrays.asList(                          new  Actor(1,  "岡田",  "准一",  33,  "大阪府"),                          new  Actor(2,  "柴田",  "恭兵",  62,  "静岡県"),                          new  Actor(3,  "江口",  "洋介",  46,  "東京都"),                          new  Actor(4,  "竹中",  "直人",  58,  "神奈川県"),                          new  Actor(5,  "谷原",  "章介",  41,  "神奈川県"),                          new  Actor(6,  "春風亭",  "小朝",  59,  "東京都"),                          new  Actor(7,  "寺尾",  "聰",  67,  "神奈川県"),                          new  Actor(8,  "速水",  "もこみち",  29,  "東京都"),                          new  Actor(9,  "片岡",  "鶴太郎",  59,  "東京都"),                          new  Actor(10,  "金子",  "ノブアキ",  33,  "東京都"));   }   Fork/Join を利用した マージ・ソートによる 並び替えの例
  • 33. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       34   import  java.util.ArrayList;   import  java.util.List;   import  java.util.concurrent.RecursiveTask;     public  class  MergeSortTask<  T  extends  Comparable<  ?  super  T>>                                                                extends  RecursiveTask<List<Actor>>  {            private  final  List<Actor>  list;            public  MergeSortTask(List<Actor>  list)  {                  this.list  =  list;          }            @Override          protected  List<Actor>  compute()  {                  if  (this.list.size()  <=  1)  {                          return  this.list;                  }  else  {                          int  mid  =  this.list.size()  /  2;                          MergeSortTask<Actor>  left  =                                      new  MergeSortTask<>(list.subList(0,  mid));                          MergeSortTask<Actor>  right  =                                    new  MergeSortTask<>(list.subList(mid,  this.list.size()));                          right.fork();                          return  merge(left.compute(),  right.join());                  }          }      private  List<  Actor>  merge(List<Actor>  leftList,  List<Actor>  rightList)  {                  int  leftIndex  =  0;                  int  rightIndex  =  0;                  List<Actor>  result  =  new  ArrayList<>();                  while  (true)  {                          if  (leftIndex  ==  leftList.size())  {                                  result.addAll(                                          rightList.subList(rightIndex,  rightList.size()));                                  return  result;                          }  else  if  (rightIndex  ==  rightList.size())  {                                  result.addAll(                                          leftList.subList(leftIndex,  leftList.size()));                                  return  result;                          }                          Actor  leftElement  =  leftList.get(leftIndex);                          Actor  rightElement  =  rightList.get(rightIndex);                            if  (leftElement.getAge().compareTo(rightElement.getAge())                                                                                                                                    <=  0)  {                                  result.add(leftElement);                                  ++leftIndex;                          }  else  {                                  result.add(rightElement);                                  ++rightIndex;                          }                  }          }   }   Fork/Join を利用した マージ・ソートによる 並び替えの例
  • 34. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       Fork/Jon フレームワーク 扱いやすいですか? でもパフォーマンス向上させ たいですよね
  • 35. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       JSR- 337 : Java SE 8 & Stream
  • 36. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.        users.stream()          .filter(u  -­‐>  u.getAge()  >  40)          .sorted((a1,  a2)  -­‐>  Integer.compare(a1.getAge(),  a2.getAge()))          .forEach(act  -­‐>  System.out.println(act.getFirstName()));    users.parallelStream()          .filter(u  -­‐>  u.getAge()  >  40)          .sorted((a1,  a2)  -­‐>  Integer.compare(a1.getAge(),  a2.getAge()))          .sequential()          .forEach(act  -­‐>  System.out.println(act.getFirstName()));  
  • 37. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       Stream API で かんたんに並列化を実現可能 処理はライブラリにまかせて バグ削減
  • 38. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       39   Java SE 8 から極力 for 文を排除 しましょう 慣れるためには一時的に禁止も
  • 39. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       40   並列処理を簡単に実装できる ことは何となく分かった 実際の学習コストは?
  • 40. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       41   変化にはコストが伴います ルールを理解してください
  • 41. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       public  class  Foo  {    public  void  bar(int  a,  int  b){    }    public  Object  bar2(Object  c)        {    }   } 42   今までの Java プログラミングとの違い 今まではメソッドに データを渡していた これからはメソッドに 直接処理を渡す事が可能 public  class  Foo2{      public  void  bar(処理)      public  処理 foo(処理1,  処理2)   }  
  • 42. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       43   今までもメソッドに 処理を渡せていました
  • 43. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       44   無名内部クラスを利用した処理実装例
  • 44. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       45   でも、実際に行いたい処理を 記述するためには冗長
  • 45. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       46   もっと短く記述したい でも言語仕様的に無理でした
  • 46. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       47   そこで登場したのが Lambda 式
  • 47. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       48   Lambda 式とは 無名クラスの実装を 短く記載できる記法 + α
  • 48. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       49    ExecutorService  service  =  ...;    service.submit(new  Runnable()  {                  @Override                  public  void  run()  -­‐>  {                          //  非同期に処理するタスク                        doSomething();                  }    });   メソッド引数 () までを全て消去 メソッド引数 () とボディの間に -> を挿入
  • 49. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.        ExecutorService  service  =  ...;    service.submit(()  -­‐>  doSomething());     •  単一の abstract メソッドを持つ インタフェースを無名クラスとして実装 する際の簡易記法+α Lambda 式:
  • 50. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       51   インタフェース名 引数 返り値 説明 Predicate<T> T boolean 1つの引数を受け取り boolean  を返す Consumer<T> T void 1つの引数を受け取り結果を返さない Func4on<T,R> T R 1つの引数を受け取り結果を生成する Supplier<T> 無し T 完了結果の取得 単一の abstract メソッドを持つインタフェース Java SE 8 より追加:43 個の関数型インタフェースを含む Functional(関数型)インタフェース
  • 51. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       52   関数型インタフェースを引数 に持つ箇所で Lambda 式を 記載可能
  • 52. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       JSR- 337 : Java SE 8 Stream API コレクションに対する バルク(一括)処理が可能な機能 Lambda 式を使用し可読性向上
  • 53. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       Stream API による実装 (パイプライン処理) 終端操作が呼び出されるまで処理は未実行 Stream の生成 Stream.of()! Stream.empty()! Stream.generate()! list.stream() 中間操作 filter! map! mapToInt! flatMap! distinct! sorted! limit! skip など 終端操作 forEach! forEachOrdered! toArray! reduce! collect! min,max,count! など
  • 54. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       JSR- 337 : Java SE 8 Stream API を使用し 先頭が a で始まる文字列の 抽出・出力をしてみましょう
  • 55. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       Stream の生成 Stream  stream  =        Stream.of("aaa",  "bbb",  "ccc”  ,  ”abc”);   List<String>  list  =          Arrays.asList("aaa",  "bbb",  "ccc",  “abc”);   Stream  listStream  =  list.stream();  
  • 56. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       Stream API による操作 List<String>  list  =        Arrays.asList("aaa",  "bbb",  "ccc",  "abc");   list.stream()          .filter(Predicate<?  super  T>  predicate)          .forEach(Consumer<?  super  T>  action);   条件抽出:今までの if 文を filter で置き換え 出力部分:for 文を forEach で置き換え
  • 57. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       Predicate/Consumer インタフェース @FunctionalInterface   public  interface  Predicate<T>  {        boolean  test(T  t)   }   @FunctionalInterface   public  interface  Consumer<T>{      void  accept(T  t);   }  
  • 58. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       Stream によるコレクション操作 無名内部クラスで実装  List<String>  list  =       Arrays.asList("aaa",  "bbb",  "ccc",  "abc");    list.stream()     .filter(new  Predicate<String>()  {              public  boolean  test(String  data)    {                      return  data.startsWith("a");              }})        .forEach(new  Consumer<String>()  {              public  void  accept(String  data)      {                      System.out.println(data);              }});  
  • 59. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       Lambda 式に変換 メソッドの引数とボディを残し間に矢印 -> を挿入  List<String>  list  =       Arrays.asList("aaa",  "bbb",  "ccc",  "abc");    list.stream()     .filter(new  Predicate<String>()  {              public  boolean  test(String  data)    {                      return  data.startsWith("a");              }})        .forEach(new  Consumer<String>()  {              public  void  accept(String  data)      {                      System.out.println(data);              }});   -> ->
  • 60. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       型推論の改善 型情報 (String) を省略可能  List<String>  list  =       Arrays.asList("aaa",  "bbb",  "ccc",  "abc");    list.stream()     .filter(new  Predicate<String>()  {              public  boolean  test(String  data)    {                      return  data.startsWith("a");              }})        .forEach(new  Consumer<String>()  {              public  void  accept(String  data)      {                      System.out.println(data);              }});   -> ->
  • 61. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       メソッド引数部分の括弧 () の省略 単一引数の場合 () を省略可能  List<String>  list  =       Arrays.asList("aaa",  "bbb",  "ccc",  "abc");    list.stream()     .filter(new  Predicate<String>()  {              public  boolean  test(String  data)    {                      return  data.startsWith("a");              }})        .forEach(new  Consumer<String>()  {              public  void  accept(String  data)      {                      System.out.println(data);              }});   -> ->
  • 62. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       単一行のブロックを省略 単一行の場合ブロック(return)を省略可能  List<String>  list  =       Arrays.asList("aaa",  "bbb",  "ccc",  "abc");    list.stream()     .filter(new  Predicate<String>()  {              public  boolean  test(String  data)   {                      return  data.startsWith("a");              }})        .forEach(new  Consumer<String>()  {              public  void  accept(String  data)      {                      System.out.println(data);              }});   -> ->
  • 63. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       メソッド参照・コンストラクタ参照 Lambda 式で単に既存のメソッドを呼び出す場合、 メソッド参照の記法で簡易的に記述可能 (String  data)  -­‐>  System.out.println(data)   System.out::println  
  • 64. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       メソッド参照による書き換え  List<String>  list  =       Arrays.asList("aaa",  "bbb",  "ccc",  "abc");    list.stream()     .filter(new  Predicate<String>()  {              public  boolean  test(String  data)   {                      return  data.startsWith("a");              }})        .forEach(new  Consumer<String>()  {              public  void  accept(String  data)      {                      System.out::println(data);              }});   -> ->
  • 65. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       Lambda 式 と Stream API 最終形式:Lambda 式により簡潔に記述可能 List<String>  list  =      Arrays.asList("aaa",  "bbb",  "ccc",  "abc");   list.stream()      .filter(data  -­‐>  data.startsWith("a”))      .forEach(System.out::println);  
  • 66. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       67   変化には必ずコストが伴います。 Lambda は単なる新しい構文の問題ではありません。 いくつかの新しい概念が導入されているため、開発中のプロ ジェクトで Lambda 式を利用しない場合も、Javaコードを レビューするために Lambda 式を学ぶ必要があります。 また、コア・ライブラリに対しても大幅に機能が追加される ため、その機能についても学ぶ必要があります。 しかし、Lambda 式と Stream API による生産性と表現力 の向上は、これらのコストを補って余りあるはずです。スペック・リード Brien Goetz
  • 67. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       68   人生における最大の失敗は、 失敗を恐れ続けることである。 エルバート・ハバード(教育家)
  • 68. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       69   Java SE 8 の Lambda 式とStream API どうぞご適用ください
  • 69. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       70   Java SE 8 に アップグレードする その他の理由
  • 70. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       71   Java SE 7 公式アップデート終了 2015 年 4月 hGp://www.oracle.com/technetwork/jp/java/eol-­‐135779-­‐ja.html
  • 71. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       JDK 8 の新機能概要 イノベーション •  Lambda  aka  Closures   •  Language  Interop   •  Nashorn   コア・ライブラリ •  Parallel  operaSons  for  core     collecSons  APIs   •  Improvements  in  funcSonality   •  Improved  type  inference   全体的な改善 •  JVM  enhancements   •  No  PermGen  limitaSons   •  Performance  improvements   ツール •  Compiler  control  &  logging   •  JSR  308-­‐AnnotaSons  on  Java  Type   •  NaSve  app  bundling     •  App  Store  Bundling  tools     クライアント •  Deployment  enhancements   •  JavaFX  8   •  Public  UI  Control  API   •  Java  SE  Embedded  support   •  Enhanced  HTML5  support   •  3D  shapes  and  aGributes   •  PrinSng   セキュリティ •  Limited  doPrivilege   •  NSA  Suite  B  algorithm  support   •  SNI  Server  Side  support   •  DSA  updated  to  FIPS186-­‐3   •  AEAD  JSSE  CipherSuites   エンタープライズ •  Mission  Control   •  Flight  Recorder   •  Usage  Tracker   •  Advanced  Management  Console   •  MSI  Enterprise  JRE  Installer   全ての Java 利用者へ •  Profiles  for  constrained  devices   •  JSR  310-­‐Date  &  Time  APIs   •  Non-­‐Gregorian  calendars   •  Unicode  6.1   •  ResourceBundle     •  BCP47  locale  matching   •  GlobalizaSon  &  Accessibility   72  
  • 72. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       73   " Fork/Join の改良 " 高速な Atomic 変数, 並列処理 ライブラリ " 高速化された最適化 collec4on.parallelStream()   .filter(Objects::nonNull)   .forEach(item  -­‐>  {      //benefit  from  Fork/Join   });   65000   85000   105000   125000   JDK  7u17   JDK  7u40   JDK  8   Max-­‐jOPS   SPECjbb2013 によるパフォーマンス改良結果例 40%   Oracle  JDK  7u17  –  Oracle  SPARC  T5-­‐2  –  75658  SPECjbb2013-­‐MulSJVM  Max-­‐jOPS,  23334  SPECjbb2013-­‐MulSJVM  CriScal-­‐jOPS   Oracle  JDK  7u40  –  Oracle  SPARC  T5-­‐2  –  81084  SPECjbb2013-­‐MulSJVM  Max-­‐jOPS,  39129  SPECjbb2013-­‐MulSJVM  CriScal-­‐jOPS   Oracle  JDK  8  –  Oracle  SPARC  T5-­‐2  –  114492  SPECjbb2013-­‐MulSJVM  Max-­‐jOPS,  43963  SPECjbb2013-­‐MulSJVM  CriScal-­‐jOPS   Source:  www.spec.org  as  of  March  10  th  2014   SPEC  and  the  benchmark  name  SPECjbb  are  registered  trademarks  of  Standard  Performance  EvaluaSon  CorporaSon  (SPEC)   パフォーマンス改良
  • 73. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       74   最新バージョンへの移行を推奨  Java SE 8  Java EE 7 最新 Java プラットフォーム
  • 74. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       JDK  8   •  Lambda   •  JSR  310:  New  Date  and  Time  API   •  Nashorn:  JavaScript   Interoperability   •  JavaFX  Enhancements   8u40   •  Performance  Improvements   •  Density  and  Resource  Management   •  MulS-­‐Language  Support  Improvements   •  Accessibility  Enhancements   •  ConSnued  Java  SE  Advanced  Features   JDK  9   •  Modularity  –  Jigsaw   •  HTTP  2.0   •  Lightweight  JSON   •  Cloud  opSmized  JVM   •  ConSnued  Java  SE  Advanced  Features   •  Ahead  of  Time  CompilaSon   8u20   •  G1  Performance  Improvement   •  JVM  Performance  Improvements   •  Java  Mission  Control  5.4   •  Advanced  Management  Console  1.0   •  MSI  Enterprise  JRE  Installer   8u60   •  Bug  Fixes   •  ConSnued  Java  SE  Advanced  Features   20162014 2015 2017 75   Java SE のロードマップ
  • 75. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       76   年 4 回 定期的なクリティカル・パッチ提供 今後の予定  2015 年 4 月 14 日  2015 年 7 月 14 日  2015 年 10 月 20 日  2016 年 1 月 19 日
  • 76. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       Java Day Tokyo 2015 Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |   2015年4月8日(⽔水)  東京国際フォーラム www.oracle.co.jp/jdt2015/ 77
  • 77. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       今年 2015 年は Java 生誕 20 周年 " 30 億デバイス " 97% エンタープライズ PC " 900 万人の開発者 " 81 カ国 300 以上の JUG 78  
  • 78. Copyright  ©  2015,  Oracle  and/or  its  affiliates.  All  rights  reserved.       79