JSR 335Project Lambda     開発部     てるー
Java8 (JSR 337)JSR 308: Annotations on Java TypesJSR 310: Date and Time APIJSR TBD: More Small Enhancements to the JavaPro...
例1       BeforeFile srcDir = new File(“src");File[] javaFiles = srcDir.listFiles(new FilenameFilter() {       @Override   ...
例1       AfterFile srcDir = new File(“src");File[] javaFiles = srcDir.listFiles(     (dir, name) -> name.endsWith(".java"));
例2        Beforestatic final List<Integer> NUMBER_LIST =        Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);List<Integer> ...
例2        Afterstatic final List<Integer> NUMBER_LIST =        Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);List<Integer> e...
アジェンダ1. どういうときにラムダ式が使えるの?2. ラムダ式の形式は?3. ラムダ式の中で final じゃないローカル変数   を扱える!?4. ラムダ式を書かないでメソッドを参照させ   る!5. インターフェースにも実装が!?6. j...
1. どういうときにラムダ    式が使えるの?
ラムダ式が使える型について•   新たに関数型という型が追加される訳では    ない•   ラムダ式は単一メソッドのインターフェー    スのインスタンスを簡単に書ける記法• 単一メソッドのインターフェース=> Functional inter...
つまり、こういうことだFile[] javaFiles = srcDir.listFiles(new FilenameFilter() {       @Override       public boolean accept(File dir...
例1    メソッドが1つinterface Runnable {   void run();}
例2 java.lang.Object の public で実装されているものはカウントしないinterface Comparator<T> {   int compare(T o1, T o2);   boolean equals(Objec...
例3    同じシグネチャinterface X {   int method(String s);}interface Y {   int method(String s);}interface Z extends X, Y {}
例4 default method はカウントしないpublic interface Block<T> {  void apply(T t);    Block<T> chain(Block<? super T> second) default...
標準ライブラリの Functional interface•   java.lang.Runnable•   java.util.concurrent.Callable•   java.security.PrivilegedAction•   ...
java.util.functions のインターフェース•   BiBlock             •   Factory•   BiMapper            •   IntBinaryOperator•   BinaryOpe...
2. ラムダ式の形式は?
ラムダ式の形式LambdaParameters -> LambdaBody
LambdaParameters// 引数なし() -> { return 0; }// 引数が 1 つ(int x) -> { return 0; }(x) -> { return 0; }x -> { return 0; }// 引数が複数...
LambdaBody// 何もしない() -> { }// 単文(x, y) -> { return x + y; }(x, y) -> x + y// 複文() -> {   System.out.println("test");   ret...
3. ラムダ式の中で finalじゃないローカル変数を     扱える!?
外部のローカル変数には final をつけるFile srcDir = new File("src");final String suffix = ".java";File[] javaFiles = srcDir.listFiles(new ...
ラムダ式の場合は final をつけていなくても OK!File srcDir = new File("src");String suffix = ".java";File[] javaFiles = srcDir.listFiles(    ...
ただし、実質的に final じゃないとダメ!File srcDir = new File("src");String suffix = ".java";suffix = ".xml";File[] javaFiles = srcDir.lis...
ただし、実質的に final じゃないとダメ!File srcDir = new File("src");String suffix = ".java";File[] javaFiles = srcDir.listFiles(     (dir...
実験タイム
4. ラムダ式を書かないでメソッドを参照させる!
Method references•   ラムダ式を書く代わりに既存のメソッドを    呼び出すことができる•   形式    o   <クラス名 or インスタンス名> :: <メソッド名 or        new>•   例    o S...
例1    static メソッドclass Person {  private final String name;  private final int age;    public static int compareByAge(Pers...
例2 インスタンスメソッド(1)    (<インスタンス名>::<メソッド名>)class ComparisonProvider {  public int compareByAge(Person a, Person b) { ... }  p...
例3 インスタンスメソッド(2) (<クラス名>::<メソッド名>)String[] names = new String[] {"Hoge", "Piyo", "Boo"};Arrays.sort(names, String::compare...
例4        コンストラクタclass Car { ... }interface CarFactory {   Car newCar();}CarFactory factory = Car::new;
5. インターフェースにも     実装が?
Default methodsインターフェースのメソッドにデフォルトの処理を書けるpublic interface Comparator<T> {  ...  Comparator<T> reverse() default {      ret...
どうしてこのような仕様があるのか?•   前バージョンで公開済みのインターフェー    スに新たなメソッドを追加しても、互換性    を保てる•   新たなメソッドが追加されたインター    フェース    o java.util.Compar...
継承について•   クラスの実装の方がインターフェースのデ    フォルトよりも優先される•   複数のインターフェースを継承していた場    合    o   コンフリクトした場合、どちらの default method を        使...
どちらの default method を使用するかを記述する場合interface A {   void method() default { ... }}interface B {   void method() default { ......
オーバライドした方が優先されるinterface Base {   void method() default { ... }}interface A extends Base {   void method() default { ... }...
6. java.lang.Iterable が      なんかヤバい
java.lang.Iterable の新メソッド•   allMatch   •   groupBy•   anyMatch   •   groupByMulti•   count      •   into•   cumulate   • ...
java.lang.Iterable の新メソッド•   allMatch   •   groupBy•   anyMatch   •   groupByMulti•   count      •   into•   cumulate   • ...
リストの中から偶数のみを標準出力する(1)•   forEach    o   [概要]: 個々の要素へ処理を加える    o   [引数]: Block<? super T>    o   [戻り値]: なし    o   [Block の抽...
リストの中から偶数のみを標準出力する(2)•   filter    o   [概要]: 条件にあった要素だけをフィルタリングする    o   [引数]: Predicate<? super T>    o   [戻り値]: Iterable...
リストの中から偶数のみを 標準出力する(3)static final List<Integer> NUMBER_LIST =     Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);Iterable<In...
リストの中から偶数のみを 標準出力する(4)static final List<Integer> NUMBER_LIST =     Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);NUMBER_LIST...
リストの中の身長の最大値を出力する(1)•   map    o [概要]: 要素に処理を加えることで、新しいコレク      ションを生成する    o [引数]: Mapper<? super T,? extends U>    o [戻り...
リストの中の身長の最大値を出力する(2)•   reduce    o [概要]: 要素をまとめて、1つの値を生成する    o [引数1]:結果の初期値    o [引数2]: BinaryOperator<T>    o [戻り値]: 最終...
リストの中の身長の最大値を出力する(3)class Student {    private final String name;    private final int height;    ...}static final List<St...
リストの中の身長の最大値を出力する(4)class Student {    private final String name;    private final int height;    ...}static final List<St...
参考資料・公式ドキュメントhttp://openjdk.java.net/projects/lambda/・JDK ダウンロードhttp://jdk8.java.net/lambda/・Eclipse で Java8 !http://d.hat...
Upcoming SlideShare
Loading in …5
×

Project lambda

1,270 views

Published on

アプレッソ社内勉強会資料

Published in: Technology, News & Politics
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,270
On SlideShare
0
From Embeds
0
Number of Embeds
304
Actions
Shares
0
Downloads
10
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Project lambda

  1. 1. JSR 335Project Lambda 開発部 てるー
  2. 2. Java8 (JSR 337)JSR 308: Annotations on Java TypesJSR 310: Date and Time APIJSR TBD: More Small Enhancements to the JavaProgramming LanguageJSR 335: Lambda Expressions for the Java ProgrammingLanguageJSR TBD: Java Platform Module System
  3. 3. 例1 BeforeFile srcDir = new File(“src");File[] javaFiles = srcDir.listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.endsWith(".java"); } });
  4. 4. 例1 AfterFile srcDir = new File(“src");File[] javaFiles = srcDir.listFiles( (dir, name) -> name.endsWith(".java"));
  5. 5. 例2 Beforestatic final List<Integer> NUMBER_LIST = Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);List<Integer> evenNumberList = new ArrayList<Integer>();for (int number : NUMBER_LIST) { if (number % 2 == 0) { evenNumberList.add(number); }}
  6. 6. 例2 Afterstatic final List<Integer> NUMBER_LIST = Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);List<Integer> evenNumberList = new ArrayList<Integer>(NUMBER_LIST);evenNumberList.retainAll(i -> i % 2 == 0);
  7. 7. アジェンダ1. どういうときにラムダ式が使えるの?2. ラムダ式の形式は?3. ラムダ式の中で final じゃないローカル変数 を扱える!?4. ラムダ式を書かないでメソッドを参照させ る!5. インターフェースにも実装が!?6. java.lang.Iterable がなんかヤバい!
  8. 8. 1. どういうときにラムダ 式が使えるの?
  9. 9. ラムダ式が使える型について• 新たに関数型という型が追加される訳では ない• ラムダ式は単一メソッドのインターフェー スのインスタンスを簡単に書ける記法• 単一メソッドのインターフェース=> Functional interface
  10. 10. つまり、こういうことだFile[] javaFiles = srcDir.listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.endsWith(".java"); } }); =FilenameFilter filter = (dir, name) -> name.endsWith(".java");File[] javaFiles = srcDir.listFiles(filter);
  11. 11. 例1 メソッドが1つinterface Runnable { void run();}
  12. 12. 例2 java.lang.Object の public で実装されているものはカウントしないinterface Comparator<T> { int compare(T o1, T o2); boolean equals(Object obj);}
  13. 13. 例3 同じシグネチャinterface X { int method(String s);}interface Y { int method(String s);}interface Z extends X, Y {}
  14. 14. 例4 default method はカウントしないpublic interface Block<T> { void apply(T t); Block<T> chain(Block<? super T> second) default { return Blocks.chain(this, second); }}
  15. 15. 標準ライブラリの Functional interface• java.lang.Runnable• java.util.concurrent.Callable• java.security.PrivilegedAction• java.util.Comparator• java.io.FileFilter• java.nio.file.PathMatcher• java.lang.reflect.InvocationHandler• java.beans.PropertyChangeListener• java.awt.event.ActionListener• javax.swing.event.ChangeListener
  16. 16. java.util.functions のインターフェース• BiBlock • Factory• BiMapper • IntBinaryOperator• BinaryOperator • IntMapper• BiPredicate • LongBinaryOperato• Block r• DoubleBinaryOpera • LongMapper tor • Mapper• DoubleMapper • Predicate
  17. 17. 2. ラムダ式の形式は?
  18. 18. ラムダ式の形式LambdaParameters -> LambdaBody
  19. 19. LambdaParameters// 引数なし() -> { return 0; }// 引数が 1 つ(int x) -> { return 0; }(x) -> { return 0; }x -> { return 0; }// 引数が複数(int x, int y) -> { return 0; }(x, y) -> { return 0; }
  20. 20. LambdaBody// 何もしない() -> { }// 単文(x, y) -> { return x + y; }(x, y) -> x + y// 複文() -> { System.out.println("test"); return 0;}
  21. 21. 3. ラムダ式の中で finalじゃないローカル変数を 扱える!?
  22. 22. 外部のローカル変数には final をつけるFile srcDir = new File("src");final String suffix = ".java";File[] javaFiles = srcDir.listFiles(new FilenameFilter() { @Override boolean accept(File dir, String name) { return name.endsWith(suffix); } });
  23. 23. ラムダ式の場合は final をつけていなくても OK!File srcDir = new File("src");String suffix = ".java";File[] javaFiles = srcDir.listFiles( (dir, name) -> name.endsWith(suffix));
  24. 24. ただし、実質的に final じゃないとダメ!File srcDir = new File("src");String suffix = ".java";suffix = ".xml";File[] javaFiles = srcDir.listFiles( (dir, name) -> name.endsWith(suffix)); // コンパイルエラー
  25. 25. ただし、実質的に final じゃないとダメ!File srcDir = new File("src");String suffix = ".java";File[] javaFiles = srcDir.listFiles( (dir, name) -> { suffix = ".xml"; // コンパイルエラー return name.endsWith(suffix);}); // コンパイルエラー
  26. 26. 実験タイム
  27. 27. 4. ラムダ式を書かないでメソッドを参照させる!
  28. 28. Method references• ラムダ式を書く代わりに既存のメソッドを 呼び出すことができる• 形式 o <クラス名 or インスタンス名> :: <メソッド名 or new>• 例 o System::getProperty o "abc"::length o String::length o ArrayList::new
  29. 29. 例1 static メソッドclass Person { private final String name; private final int age; public static int compareByAge(Person a, Person b) { ... } public static int compareByName(Person a, Person b){ ... }}Person[] people = ...Arrays.sort(people, Person::compareByAge);
  30. 30. 例2 インスタンスメソッド(1) (<インスタンス名>::<メソッド名>)class ComparisonProvider { public int compareByAge(Person a, Person b) { ... } public int compareByName(Person a, Person b) { ... }}ComparisonProvider comparisonProvider = new ComparisonProvider();Arrays.sort( people, comparisonProvider ::compareByName);
  31. 31. 例3 インスタンスメソッド(2) (<クラス名>::<メソッド名>)String[] names = new String[] {"Hoge", "Piyo", "Boo"};Arrays.sort(names, String::compareToIgnoreCase);class String { public int compareToIgnoreCase(String str)}interface Comparator<T> { int compare(T o1, T o2);}
  32. 32. 例4 コンストラクタclass Car { ... }interface CarFactory { Car newCar();}CarFactory factory = Car::new;
  33. 33. 5. インターフェースにも 実装が?
  34. 34. Default methodsインターフェースのメソッドにデフォルトの処理を書けるpublic interface Comparator<T> { ... Comparator<T> reverse() default { return Collections.reverseOrder(this); } ...}
  35. 35. どうしてこのような仕様があるのか?• 前バージョンで公開済みのインターフェー スに新たなメソッドを追加しても、互換性 を保てる• 新たなメソッドが追加されたインター フェース o java.util.Comparator  compose  reverse o java.lang.Iterable  filter  forEach
  36. 36. 継承について• クラスの実装の方がインターフェースのデ フォルトよりも優先される• 複数のインターフェースを継承していた場 合 o コンフリクトした場合、どちらの default method を 使用するかを記述する必要がある o ただし、継承元のインターフェースの親が同じだっ た場合は特別
  37. 37. どちらの default method を使用するかを記述する場合interface A { void method() default { ... }}interface B { void method() default { ... }}interface TestInterface extends A, B { void method() default { B.super.method(); }}
  38. 38. オーバライドした方が優先されるinterface Base { void method() default { ... }}interface A extends Base { void method() default { ... }}interface B extends Base { }interface TestInterface extends A, B { void method(); // A の default method になる}
  39. 39. 6. java.lang.Iterable が なんかヤバい
  40. 40. java.lang.Iterable の新メソッド• allMatch • groupBy• anyMatch • groupByMulti• count • into• cumulate • isEmpty• fillter • map• flatMap • mapped• forEach • mapReduce• getAny • noneMatch• getFirst • reduce• getOnly • sorted • uniqueElements
  41. 41. java.lang.Iterable の新メソッド• allMatch • groupBy• anyMatch • groupByMulti• count • into• cumulate • isEmpty• fillter • map• flatMap • mapped• forEach • mapReduce• getAny • noneMatch• getFirst • reduce• getOnly • sorted • uniqueElements
  42. 42. リストの中から偶数のみを標準出力する(1)• forEach o [概要]: 個々の要素へ処理を加える o [引数]: Block<? super T> o [戻り値]: なし o [Block の抽象メソッド]: void apply(T t)
  43. 43. リストの中から偶数のみを標準出力する(2)• filter o [概要]: 条件にあった要素だけをフィルタリングする o [引数]: Predicate<? super T> o [戻り値]: Iterable<T> o [Predicate の抽象メソッド]: boolean test(T t)
  44. 44. リストの中から偶数のみを 標準出力する(3)static final List<Integer> NUMBER_LIST = Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);Iterable<Integer> evenNumberList = NUMBER_LIST.filter(i -> i % 2 == 0);evenNumberList .forEach(i -> System.out.println(i));
  45. 45. リストの中から偶数のみを 標準出力する(4)static final List<Integer> NUMBER_LIST = Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);NUMBER_LIST.filter(i -> i % 2 == 0) .forEach(i -> System.out.println(i));
  46. 46. リストの中の身長の最大値を出力する(1)• map o [概要]: 要素に処理を加えることで、新しいコレク ションを生成する o [引数]: Mapper<? super T,? extends U> o [戻り値]: Iterable<U> o [Mapper の抽象メソッド]: U map(T t)
  47. 47. リストの中の身長の最大値を出力する(2)• reduce o [概要]: 要素をまとめて、1つの値を生成する o [引数1]:結果の初期値 o [引数2]: BinaryOperator<T> o [戻り値]: 最終的な結果 o [BinaryOperator の抽象メソッド]: T eval(T left,T right)
  48. 48. リストの中の身長の最大値を出力する(3)class Student { private final String name; private final int height; ...}static final List<Student> STUDENT_LIST;...Iterable<Integer> heightList = STUDENT_LIST.map(s -> s.getHeight());int max = heightList.reduce(-1, (x, y) -> Math.max(x, y));System.out.println(max);
  49. 49. リストの中の身長の最大値を出力する(4)class Student { private final String name; private final int height; ...}static final List<Student> STUDENT_LIST;...System.out.println( STUDENT_LIST.map(s -> s.getHeight()) .reduce(-1, (x, y) -> Math.max(x, y)));
  50. 50. 参考資料・公式ドキュメントhttp://openjdk.java.net/projects/lambda/・JDK ダウンロードhttp://jdk8.java.net/lambda/・Eclipse で Java8 !http://d.hatena.ne.jp/tm_senda/20120715/1342378068・Project Lambda ハンズオンhttp://javainthebox.net/lambdahandson.html・bitter_foxの日記http://d.hatena.ne.jp/bitter_fox/

×