SlideShare a Scribd company logo
JSR 335
Project Lambda
     開発部
     てるー
Java8 (JSR 337)
JSR 308: Annotations on Java Types

JSR 310: Date and Time API

JSR TBD: More Small Enhancements to the Java
Programming Language

JSR 335: Lambda Expressions for the Java Programming
Language

JSR TBD: Java Platform Module System
例1       Before
File srcDir = new File(“src");

File[] javaFiles = srcDir.listFiles(new FilenameFilter() {
       @Override
       public boolean accept(File dir, String name) {
         return name.endsWith(".java");
       }
   });
例1       After
File srcDir = new File(“src");

File[] javaFiles = srcDir.listFiles(
     (dir, name) -> name.endsWith(".java"));
例2        Before
static 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);
  }
}
例2        After
static 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);
アジェンダ
1. どういうときにラムダ式が使えるの?
2. ラムダ式の形式は?
3. ラムダ式の中で final じゃないローカル変数
   を扱える!?
4. ラムダ式を書かないでメソッドを参照させ
   る!
5. インターフェースにも実装が!?
6. java.lang.Iterable がなんかヤバい!
1. どういうときにラムダ
    式が使えるの?
ラムダ式が使える型について
•   新たに関数型という型が追加される訳では
    ない

•   ラムダ式は単一メソッドのインターフェー
    スのインスタンスを簡単に書ける記法

• 単一メソッドのインターフェース
=> Functional interface
つまり、こういうことだ
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);
例1    メソッドが1つ
interface Runnable {
   void run();
}
例2 java.lang.Object の public で実
装されているものはカウントしない
interface Comparator<T> {
   int compare(T o1, T o2);
   boolean equals(Object obj);
}
例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 {
      return Blocks.chain(this, second);
    }
}
標準ライブラリの 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
java.util.functions のインターフェー
ス
•   BiBlock             •   Factory
•   BiMapper            •   IntBinaryOperator
•   BinaryOperator      •   IntMapper
•   BiPredicate         •   LongBinaryOperato
•   Block                   r
•   DoubleBinaryOpera   •   LongMapper
    tor                 •   Mapper
•   DoubleMapper        •   Predicate
2. ラムダ式の形式は?
ラムダ式の形式
LambdaParameters '->' LambdaBody
LambdaParameters
// 引数なし
() -> { return 0; }

// 引数が 1 つ
(int x) -> { return 0; }
(x) -> { return 0; }
x -> { return 0; }

// 引数が複数
(int x, int y) -> { return 0; }
(x, y) -> { return 0; }
LambdaBody
// 何もしない
() -> { }

// 単文
(x, y) -> { return x + y; }
(x, y) -> x + y

// 複文
() -> {
   System.out.println("test");
   return 0;
}
3. ラムダ式の中で final
じゃないローカル変数を
     扱える!?
外部のローカル変数には 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);
       }
   });
ラムダ式の場合は final をつけていな
くても OK!
File srcDir = new File("src");
String suffix = ".java";

File[] javaFiles = srcDir.listFiles(
     (dir, name) -> name.endsWith(suffix));
ただし、実質的に final じゃないとダ
メ!
File srcDir = new File("src");
String suffix = ".java";
suffix = ".xml";

File[] javaFiles = srcDir.listFiles(
     (dir, name) -> name.endsWith(suffix)); // コンパイルエ
ラー
ただし、実質的に final じゃないとダ
メ!
File srcDir = new File("src");
String suffix = ".java";

File[] javaFiles = srcDir.listFiles(
     (dir, name) -> {
           suffix = ".xml"; // コンパイルエラー
           return name.endsWith(suffix);}); // コンパイルエラー
実験タイム
4. ラムダ式を書かないで
メソッドを参照させる!
Method references
•   ラムダ式を書く代わりに既存のメソッドを
    呼び出すことができる
•   形式
    o   <クラス名 or インスタンス名> :: <メソッド名 or
        new>
•   例
    o System::getProperty
    o "abc"::length
    o String::length
    o ArrayList::new
例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);
例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);
例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);
}
例4        コンストラクタ
class Car { ... }

interface CarFactory {
   Car newCar();
}

CarFactory factory = Car::new;
5. インターフェースにも
     実装が?
Default methods
インターフェースのメソッドにデフォルトの処
理を書ける

public interface Comparator<T> {
  ...
  Comparator<T> reverse() default {
      return Collections.reverseOrder(this);
  }
  ...
}
どうしてこのような仕様があるのか?
•   前バージョンで公開済みのインターフェー
    スに新たなメソッドを追加しても、互換性
    を保てる
•   新たなメソッドが追加されたインター
    フェース
    o java.util.Comparator
        compose
        reverse
    o java.lang.Iterable
        filter
        forEach
継承について
•   クラスの実装の方がインターフェースのデ
    フォルトよりも優先される

•   複数のインターフェースを継承していた場
    合
    o   コンフリクトした場合、どちらの default method を
        使用するかを記述する必要がある
    o   ただし、継承元のインターフェースの親が同じだっ
        た場合は特別
どちらの default method を使用する
かを記述する場合
interface A {
   void method() default { ... }
}

interface B {
   void method() default { ... }
}

interface TestInterface extends A, B {
   void method() default {
     B.super.method();
   }
}
オーバライドした方が優先される
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 になる
}
6. java.lang.Iterable が
      なんかヤバい
java.lang.Iterable の新メソッド
•   allMatch   •   groupBy
•   anyMatch   •   groupByMulti
•   count      •   into
•   cumulate   •   isEmpty
•   fillter    •   map
•   flatMap    •   mapped
•   forEach    •   mapReduce
•   getAny     •   noneMatch
•   getFirst   •   reduce
•   getOnly    •   sorted
               •   uniqueElements
java.lang.Iterable の新メソッド
•   allMatch   •   groupBy
•   anyMatch   •   groupByMulti
•   count      •   into
•   cumulate   •   isEmpty
•   fillter    •   map
•   flatMap    •   mapped
•   forEach    •   mapReduce
•   getAny     •   noneMatch
•   getFirst   •   reduce
•   getOnly    •   sorted
               •   uniqueElements
リストの中から偶数のみを
標準出力する(1)
•   forEach
    o   [概要]: 個々の要素へ処理を加える
    o   [引数]: Block<? super T>
    o   [戻り値]: なし
    o   [Block の抽象メソッド]: void apply(T t)
リストの中から偶数のみを
標準出力する(2)
•   filter
    o   [概要]: 条件にあった要素だけをフィルタリングする
    o   [引数]: Predicate<? super T>
    o   [戻り値]: Iterable<T>
    o   [Predicate の抽象メソッド]: boolean test(T t)
リストの中から偶数のみを
 標準出力する(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));
リストの中から偶数のみを
 標準出力する(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));
リストの中の身長の最大値を出力する
(1)
•   map
    o [概要]: 要素に処理を加えることで、新しいコレク
      ションを生成する
    o [引数]: Mapper<? super T,? extends U>
    o [戻り値]: Iterable<U>
    o [Mapper の抽象メソッド]: U map(T t)
リストの中の身長の最大値を出力する
(2)
•   reduce
    o [概要]: 要素をまとめて、1つの値を生成する
    o [引数1]:結果の初期値
    o [引数2]: BinaryOperator<T>
    o [戻り値]: 最終的な結果
    o [BinaryOperator の抽象メソッド]: T eval(T left,T
      right)
リストの中の身長の最大値を出力する
(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);
リストの中の身長の最大値を出力する
(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)));
参考資料
・公式ドキュメント
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/

More Related Content

PPTX
C#を始めたばかりの人へのLINQ to Objects
PPTX
C# LINQ ~深く知って、使いまくろう~
PPTX
【java8 勉強会】 怖くない!ラムダ式, Stream API
PDF
from old Java to modern Java
PPT
ジェネリクスの基礎と クラス設計への応用
PDF
LINQソースでGO!
PDF
Java SE 8 lambdaで変わる プログラミングスタイル
PDF
JavaのGenericsとは?
C#を始めたばかりの人へのLINQ to Objects
C# LINQ ~深く知って、使いまくろう~
【java8 勉強会】 怖くない!ラムダ式, Stream API
from old Java to modern Java
ジェネリクスの基礎と クラス設計への応用
LINQソースでGO!
Java SE 8 lambdaで変わる プログラミングスタイル
JavaのGenericsとは?

What's hot (20)

PPT
G*workshop sendai 20100424(v2)
PDF
サーバーサイドでの非同期処理で色々やったよ
PDF
from old java to java8 - KanJava Edition
PPT
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
PDF
Introduction Xtend
PPTX
Chapter 6: Computing on the language (R Language Definition)
PPT
ジェネリクスの基礎と応用 JJUG CCC 2012 Fall
PDF
Java x Groovy: improve your java development life
PDF
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
PPTX
Javaプログラミング入門【第2回】
PDF
Javaセキュアコーディングセミナー東京第4回講義
PPTX
PDF
Javaセキュアコーディングセミナー東京第3回講義
PDF
「Html sql」で図書館hpにアクセスしてみよう
PPTX
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
PDF
Javaセキュアコーディングセミナー東京第3回演習の解説
PDF
Java8のstreamをダラダラまとめてみる
PPTX
20071030
PPTX
CakePHP+Smartyハイブリッドによるラクラク開発
PPTX
Javaプログラミング入門【第3回】
G*workshop sendai 20100424(v2)
サーバーサイドでの非同期処理で色々やったよ
from old java to java8 - KanJava Edition
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
Introduction Xtend
Chapter 6: Computing on the language (R Language Definition)
ジェネリクスの基礎と応用 JJUG CCC 2012 Fall
Java x Groovy: improve your java development life
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
Javaプログラミング入門【第2回】
Javaセキュアコーディングセミナー東京第4回講義
Javaセキュアコーディングセミナー東京第3回講義
「Html sql」で図書館hpにアクセスしてみよう
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
Javaセキュアコーディングセミナー東京第3回演習の解説
Java8のstreamをダラダラまとめてみる
20071030
CakePHP+Smartyハイブリッドによるラクラク開発
Javaプログラミング入門【第3回】
Ad

Similar to Project lambda (20)

PPTX
Java8勉強会
PDF
BOF1-Scala02.pdf
PDF
BOF1-Scala02.pdf
PDF
BOF1-Scala02.pdf
PDF
ゆるふわJava8入門
PDF
Effective java 勉強会
PPTX
jvmlang.daitokai 1.0.0 MinCamlJを作ってみた
PPTX
ジェネリックプログラミング入門
PPTX
Junit4
KEY
Java基礎
PPTX
Java Puzzlers JJUG CCC 2016
PDF
Javaセキュアコーディングセミナー東京第1回演習の解説
PPTX
Enshu8
PPTX
Java8 Lambda chapter5
PPTX
Javaプログラミング入門【第7回】
PDF
Scalaプログラミング・マニアックス
PPTX
関数型言語&形式的手法セミナー(3)
PDF
Effective java2nd chap04
ODP
Vim scriptとJavaとHaskell
PDF
社内Java8勉強会 ラムダ式とストリームAPI
Java8勉強会
BOF1-Scala02.pdf
BOF1-Scala02.pdf
BOF1-Scala02.pdf
ゆるふわJava8入門
Effective java 勉強会
jvmlang.daitokai 1.0.0 MinCamlJを作ってみた
ジェネリックプログラミング入門
Junit4
Java基礎
Java Puzzlers JJUG CCC 2016
Javaセキュアコーディングセミナー東京第1回演習の解説
Enshu8
Java8 Lambda chapter5
Javaプログラミング入門【第7回】
Scalaプログラミング・マニアックス
関数型言語&形式的手法セミナー(3)
Effective java2nd chap04
Vim scriptとJavaとHaskell
社内Java8勉強会 ラムダ式とストリームAPI
Ad

More from Appresso Engineering Team (20)

PDF
20150302 java8 第一回_ラムダ式(1)
PPTX
Effective Java 輪読会 項目77-78
PPTX
Effective Java 輪読会 項目74-75
PDF
マルチスレッド デザインパターン ― Single Threaded Execution
PDF
JavaScript 勉強会 ― 変数・演算子・文
PDF
JavaScript 勉強会 ― 型と値
PPTX
Effective Java 輪読会 項目69-70追加
PPTX
Effective Java 輪読会 項目69-70
PPTX
Effective Java 輪読会 項目66-68
PPTX
Effective Java 輪読会 項目71-73
PPTX
Java Day Tokyo 2014 まとめ (chen)
PPTX
Effective Java 輪読会 項目63-65
PPTX
Effective Java 輪読会 項目60-62
PPTX
Effective java 輪読会 項目57-59
PPTX
Effective Java 輪読会 項目49-52
PPTX
Effective Java 輪読会 項目45-48
PPTX
Effective Java 輪読会 項目53-56
PPTX
Effective Java 輪読会 第7章 項目43-44
PDF
Effective Java 輪読会 第7章 項目41-42
PPTX
Effective Java 輪読会 第7章 項目38-40
20150302 java8 第一回_ラムダ式(1)
Effective Java 輪読会 項目77-78
Effective Java 輪読会 項目74-75
マルチスレッド デザインパターン ― Single Threaded Execution
JavaScript 勉強会 ― 変数・演算子・文
JavaScript 勉強会 ― 型と値
Effective Java 輪読会 項目69-70追加
Effective Java 輪読会 項目69-70
Effective Java 輪読会 項目66-68
Effective Java 輪読会 項目71-73
Java Day Tokyo 2014 まとめ (chen)
Effective Java 輪読会 項目63-65
Effective Java 輪読会 項目60-62
Effective java 輪読会 項目57-59
Effective Java 輪読会 項目49-52
Effective Java 輪読会 項目45-48
Effective Java 輪読会 項目53-56
Effective Java 輪読会 第7章 項目43-44
Effective Java 輪読会 第7章 項目41-42
Effective Java 輪読会 第7章 項目38-40

Project lambda