Recommended
PDF
PDF
PDF
はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化
PDF
PDF
PDF
PDF
PDF
PDF
PDF
Functional Programming in Swift
PDF
PDF
あなたのScalaを爆速にする7つの方法(日本語版)
PDF
Equality in Scala (ScalaMatsuri 2020)
PDF
PDF
PDF
PDF
PPTX
PDF
Effective Modern C++ 勉強会 Item26
PPTX
PDF
PDF
PDF
PDF
PDF
PDF
PDF
PPTX
PPTX
Sales Promotion & Supplementary Media
PDF
More Related Content
PDF
PDF
PDF
はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化
PDF
PDF
PDF
PDF
PDF
What's hot
PDF
PDF
Functional Programming in Swift
PDF
PDF
あなたのScalaを爆速にする7つの方法(日本語版)
PDF
Equality in Scala (ScalaMatsuri 2020)
PDF
PDF
PDF
PDF
PPTX
PDF
Effective Modern C++ 勉強会 Item26
PPTX
PDF
PDF
PDF
PDF
PDF
PDF
PDF
PPTX
Viewers also liked
PPTX
Sales Promotion & Supplementary Media
PDF
PDF
Job announcement accountant assistant of ROPPA
PPTX
PPTX
PPTX
140 день святого николая-3класс
PPTX
PDF
ToR for the policy dialogue relative to the IYFF
PPTX
Presentation Mobi chem2014
PDF
Interactive powerpoint[1]
PPT
PPTX
профориентация2вариант222м
PPSX
PPTX
Analysis of magazine contents page
PPTX
Rims 2013 saving the city
PPTX
Tips mengadakan majlis perkahwinan ros
PPT
PPTX
PDF
PPTX
Stratégie Digitale CRT Centre-Val de Loire
Similar to Java8 lambdas chapter1_2
PPTX
PPTX
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
PDF
PDF
PDF
60分で体験する Stream / Lambda
ハンズオン
PPTX
【java8 勉強会】 怖くない!ラムダ式, Stream API
PDF
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
PDF
PPTX
PPTX
PPTX
PDF
HiroshimaJUG の「Java8 Lambda ハンズオン with すごい広島」を5分で振り返る
PDF
The Why and How of Java8 at LINE Fukuoka
PPTX
PDF
Java SE 8 lambdaで変わる プログラミングスタイル
PPTX
PPTX
Visual Studio による開発環境・プログラミングの進化
PDF
PDF
PDF
Java8 lambdas chapter1_2 1. 2. Table of Contents
1. Introduction
• Why Did They Need To Change Java Again ?
• What Is Functional Programming ?
• Example Domain
2. Lambda Expressions
• Your First Lambda Expression
• How to Spot a Lambda in a Haystack
• Using Values
• Functional Interfaces
• Type Inference
• Key Points
3. 4. • 文字通り「関数」を使用したプログラミング
• 入力した値に対して必ず同じ結果を返す
• オブジェクト指向におけるメソッド(一連の手続きをまとめて名前を付けたもの)
とは異なる
• 関数の特徴
• 参照透過性
• ある関数に同じ入力値を与えれば、いつ評価しても必ず同じ値が得られる
• 変数は一度定義したら二度と変えない(再代入操作で状態を書き換えない)
• 第一級関数
• 変数に代入したり、別の関数の引数や戻り値になったりすることができる
What Is Functional Programming ?
5. 6. Your First Lambda Expression
• Swing(JavaのGUIライブラリ)でボタンをクリックした際の、匿名クラ
スを用いたevent listenerの実装
• 不要な行が多い
• 読みにくい
button.addActionListener(new ActionListerner() {
public void actionPerformed(ActionEvent event) {
System.out.println("button clicked");
}
});
7. Your First Lambda Expression
• ラムダ式を使用
• (メソッドの引数) -> (処理) の形で書ける
• メソッド名や引数の型が省略できる
button.addActionListener(event -> System.out.println("button clicked"));
8. Your First Lambda Expression
• ラムダ式を使った様々な実装例
Runnable noArguments = () -> System.out.println("Hello world");
ActionListener oneArgument = event -> System.out.println("button clicked");
Runnable multiStatement = () -> {
System.out.println("Hello");
System.out.pringln(" World");
};
BinaryOperator<Long> add = (x,y) -> x + y;
BinaryOperator<Long> addExplicit = (Long x, Long y) -> x + y;
9. Your First Lambda Expression
• ラムダ式を使った様々な実装例
引数がないときは()のように書ける。
戻り値の型はvoid
Runnable noArguments = () -> System.out.println("Hello world");
10. Your First Lambda Expression
• ラムダ式を使った様々な実装例
引数が一つのときは左辺の()を省略
できる。引数名は任意で指定可能
ActionListener oneArgument = event -> System.out.println("button clicked");
11. Your First Lambda Expression
• ラムダ式を使った様々な実装例
処理が複数行に渡る場合は{}をつける
Runnable multiStatement = () -> {
System.out.println("Hello");
System.out.pringln(" World");
};
12. Your First Lambda Expression
• ラムダ式を使った様々な実装例
処理が一行の場合、returnを
省略できる(x + y の結果を返す処理の実装)
BinaryOperator<Long> add = (x,y) -> x + y;
13. Your First Lambda Expression
• ラムダ式を使った様々な実装例
引数の型は省略せずにも書ける
BinaryOperator<Long> addExplicit = (Long x, Long y) -> x + y;
14. Using Values
• 匿名クラスでは、finalのローカル変数、引数が扱える
• ラムダ式では、実質 finalのローカル変数、引数が扱える
• (場合によってはfinalが可読性を損なうこともあるため)
final String name = getUserName();
button.addActionListener(new ActionListerner(){
public void actionPerformed(ActionEvent event){
System.out.println("hi " + name);
}
});
String name = getUserName();
button.addActionListener(event -> System.out.println("hi " + name));
15. Using Values
• 下記の場合、 nameが実質finalでないのでコンパイルエラーとなる
String name = getUserName();
name = formatUserName(name);
button.addActionListener(event -> System.out.println("hi " + name));
16. Functional Interfaces
• 関数型インターフェイスとは
• 定義されている抽象メソッドが1つだけあるインターフェイス
• ラムダ式は、関数型インターフェイスに対して適用することができる
• 今後は、関数型インターフェイスをダイアグラムで表現する
• 関数に入っていく矢印は引数を、関数から出ていく矢印は戻り値の型を表す
• 関数型インターフェイスとダイアグラムの例は下記の通り
ActionListener
public interface ActionListener extends EventListener {
public void actionPerformed(ActionEvent event);
}
ActionEvent
17. Functional Interfaces
• 関数型インターフェイスには、いくつかのコアグループがある
Interface name Arguments Returns Example
Predicate<T> T boolean Has this album been
released yet?
Consumer<T> T void Printing out a value
Function<T, R> T R Get the name from
an Artist Object
Supplier<T> None T A factory method
UnaryOperator<T> T T Logical not(!)
BinaryOperator<T> (T, T) T Multiplying two
numbers(*)
18. Type Inference(型推論)
• Java7から、ダイヤモンド演算子を用いた型推論が可能
• メソッドの引数には型推論が使えなかったが、Java8から使えるよう
になった
Map<String, Integer> oldWordCounts = new HashMap<String, Integer>();
Map<String, Integer> diamondWordCounts = new HashMap<>();
useHashmap(new HashMap<>());
…
private void useHashmap(Map<String, String> values);
19. Type Inference
• ラムダ式を使った型推論
• パラメータの型は省略可能
• javacで戻り値の型がbooleanであるかチェックしてくれる
Predicate<Integer> atLeast5 = x -> x > 5;
public interface Predicate<T> {
boolean test(T t);
}
PredicateT boolean
20. Type Inference
• ラムダ式を使った型推論
• 後者では、型を指定していないため引数も戻り値の型も
java.lang.Objectとして判別される -> 足し算ができないと怒られる
/* 正常に動く */
BinaryOperator<Long> addLongs = (x, y) -> x + y;
/* コンパイルエラー */
BinaryOperator add = (x, y) -> x + y;
21.