SlideShare a Scribd company logo
Java8 Lambdas 勉強会
Chapter 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
• マルチコア化で処理性能向上を目指す時代
• java.util.concurrent パッケージなどを使った並行処理には限界がある
⇒ ラムダ式を使った関数型プログラミングで簡潔、かつ強力な並行処理の実装
が書ける
• 関数型言語の利点
• 可読性
• 保守性
• バグが少ない
Why Did They Need To Change Java Again ?
• 文字通り「関数」を使用したプログラミング
• 入力した値に対して必ず同じ結果を返す
• オブジェクト指向におけるメソッド(一連の手続きをまとめて名前を付けたもの)
とは異なる
• 関数の特徴
• 参照透過性
• ある関数に同じ入力値を与えれば、いつ評価しても必ず同じ値が得られる
• 変数は一度定義したら二度と変えない(再代入操作で状態を書き換えない)
• 第一級関数
• 変数に代入したり、別の関数の引数や戻り値になったりすることができる
What Is Functional Programming ?
Example Domain
• 本全体を通して、例の提示には共通の問題領域として音楽が使
われる
• 要約は以下の通り
• アーティスト
– 曲を作る個人やグループ
• トラック
• 一つの曲
• アルバム
• 複数のトラックの集合
• 音楽は関数型プログラミングの手法を説明する際に使われる
Your First Lambda Expression
• Swing(JavaのGUIライブラリ)でボタンをクリックした際の、匿名クラ
スを用いたevent listenerの実装
• 不要な行が多い
• 読みにくい
button.addActionListener(new ActionListerner() {
public void actionPerformed(ActionEvent event) {
System.out.println("button clicked");
}
});
Your First Lambda Expression
• ラムダ式を使用
• (メソッドの引数) -> (処理) の形で書ける
• メソッド名や引数の型が省略できる
button.addActionListener(event -> System.out.println("button clicked"));
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;
Your First Lambda Expression
• ラムダ式を使った様々な実装例
引数がないときは()のように書ける。
戻り値の型はvoid
Runnable noArguments = () -> System.out.println("Hello world");
Your First Lambda Expression
• ラムダ式を使った様々な実装例
引数が一つのときは左辺の()を省略
できる。引数名は任意で指定可能
ActionListener oneArgument = event -> System.out.println("button clicked");
Your First Lambda Expression
• ラムダ式を使った様々な実装例
処理が複数行に渡る場合は{}をつける
Runnable multiStatement = () -> {
System.out.println("Hello");
System.out.pringln(" World");
};
Your First Lambda Expression
• ラムダ式を使った様々な実装例
処理が一行の場合、returnを
省略できる(x + y の結果を返す処理の実装)
BinaryOperator<Long> add = (x,y) -> x + y;
Your First Lambda Expression
• ラムダ式を使った様々な実装例
引数の型は省略せずにも書ける
BinaryOperator<Long> addExplicit = (Long x, Long y) -> x + y;
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));
Using Values
• 下記の場合、 nameが実質finalでないのでコンパイルエラーとなる
String name = getUserName();
name = formatUserName(name);
button.addActionListener(event -> System.out.println("hi " + name));
Functional Interfaces
• 関数型インターフェイスとは
• 定義されている抽象メソッドが1つだけあるインターフェイス
• ラムダ式は、関数型インターフェイスに対して適用することができる
• 今後は、関数型インターフェイスをダイアグラムで表現する
• 関数に入っていく矢印は引数を、関数から出ていく矢印は戻り値の型を表す
• 関数型インターフェイスとダイアグラムの例は下記の通り
ActionListener
public interface ActionListener extends EventListener {
public void actionPerformed(ActionEvent event);
}
ActionEvent
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(*)
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);
Type Inference
• ラムダ式を使った型推論
• パラメータの型は省略可能
• javacで戻り値の型がbooleanであるかチェックしてくれる
Predicate<Integer> atLeast5 = x -> x > 5;
public interface Predicate<T> {
boolean test(T t);
}
PredicateT boolean
Type Inference
• ラムダ式を使った型推論
• 後者では、型を指定していないため引数も戻り値の型も
java.lang.Objectとして判別される -> 足し算ができないと怒られる
/* 正常に動く */
BinaryOperator<Long> addLongs = (x, y) -> x + y;
/* コンパイルエラー */
BinaryOperator add = (x, y) -> x + y;
Key Points
• ラムダ式は、データであるかのように振る舞いを実装でき、メソッド
名を省略できる
• ラムダ式は、以下のように書くことができる
• 関数型インターフェイスは定義されている抽象メソッドが1つだけ
あるインターフェイスのことで、ラムダ式は、関数型インターフェイ
スに対して適用することができる
BinaryOperator<Integer> add = (x, y) -> x + y;

More Related Content

What's hot (20)

Functional Programming in Swift
Functional Programming in SwiftFunctional Programming in Swift
Functional Programming in Swift
Kaz Yoshikawa
 
Scalaでプログラムを作りました
Scalaでプログラムを作りましたScalaでプログラムを作りました
Scalaでプログラムを作りました
Tomoharu ASAMI
 
Scala2.8への移行
Scala2.8への移行Scala2.8への移行
Scala2.8への移行
guest5f4320
 
ScalaMatsuri 2016
ScalaMatsuri 2016ScalaMatsuri 2016
ScalaMatsuri 2016
Yoshitaka Fujii
 
Tagless Final DSL
Tagless Final DSLTagless Final DSL
Tagless Final DSL
Hikaru Yoshimura
 
プログラミングHaskell(第1章)
プログラミングHaskell(第1章)プログラミングHaskell(第1章)
プログラミングHaskell(第1章)
yaju88
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]
Ra Zon
 
Effective Modern C++ 勉強会 Item26
Effective Modern C++ 勉強会 Item26Effective Modern C++ 勉強会 Item26
Effective Modern C++ 勉強会 Item26
Akihiro Nishimura
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタート
Shumpei Shiraishi
 
Java使いにとっての関数
Java使いにとっての関数Java使いにとっての関数
Java使いにとっての関数
amkt922
 
rpscala35-scala2.9.0
rpscala35-scala2.9.0rpscala35-scala2.9.0
rpscala35-scala2.9.0
Kenji Yoshida
 
Equality in Scala (ScalaMatsuri 2020)
Equality in Scala (ScalaMatsuri 2020)Equality in Scala (ScalaMatsuri 2020)
Equality in Scala (ScalaMatsuri 2020)
Eugene Yokota
 
ScalaプログラマのためのHaskell入門
ScalaプログラマのためのHaskell入門ScalaプログラマのためのHaskell入門
ScalaプログラマのためのHaskell入門
Yasuaki Takebe
 
夏だからJava再入門
夏だからJava再入門夏だからJava再入門
夏だからJava再入門
Katsumi Honda
 
演算子オーバーライドをDSLに活用する
演算子オーバーライドをDSLに活用する演算子オーバーライドをDSLに活用する
演算子オーバーライドをDSLに活用する
kwatch
 
Thinking in Cats
Thinking in CatsThinking in Cats
Thinking in Cats
Eugene Yokota
 
磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!
Ra Zon
 
あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)
x1 ichi
 
プログラミングHaskell(第2章)
プログラミングHaskell(第2章)プログラミングHaskell(第2章)
プログラミングHaskell(第2章)
yaju88
 
Functional Programming in Swift
Functional Programming in SwiftFunctional Programming in Swift
Functional Programming in Swift
Kaz Yoshikawa
 
Scalaでプログラムを作りました
Scalaでプログラムを作りましたScalaでプログラムを作りました
Scalaでプログラムを作りました
Tomoharu ASAMI
 
Scala2.8への移行
Scala2.8への移行Scala2.8への移行
Scala2.8への移行
guest5f4320
 
プログラミングHaskell(第1章)
プログラミングHaskell(第1章)プログラミングHaskell(第1章)
プログラミングHaskell(第1章)
yaju88
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]
Ra Zon
 
Effective Modern C++ 勉強会 Item26
Effective Modern C++ 勉強会 Item26Effective Modern C++ 勉強会 Item26
Effective Modern C++ 勉強会 Item26
Akihiro Nishimura
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタート
Shumpei Shiraishi
 
Java使いにとっての関数
Java使いにとっての関数Java使いにとっての関数
Java使いにとっての関数
amkt922
 
rpscala35-scala2.9.0
rpscala35-scala2.9.0rpscala35-scala2.9.0
rpscala35-scala2.9.0
Kenji Yoshida
 
Equality in Scala (ScalaMatsuri 2020)
Equality in Scala (ScalaMatsuri 2020)Equality in Scala (ScalaMatsuri 2020)
Equality in Scala (ScalaMatsuri 2020)
Eugene Yokota
 
ScalaプログラマのためのHaskell入門
ScalaプログラマのためのHaskell入門ScalaプログラマのためのHaskell入門
ScalaプログラマのためのHaskell入門
Yasuaki Takebe
 
夏だからJava再入門
夏だからJava再入門夏だからJava再入門
夏だからJava再入門
Katsumi Honda
 
演算子オーバーライドをDSLに活用する
演算子オーバーライドをDSLに活用する演算子オーバーライドをDSLに活用する
演算子オーバーライドをDSLに活用する
kwatch
 
磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!
Ra Zon
 
あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)
x1 ichi
 
プログラミングHaskell(第2章)
プログラミングHaskell(第2章)プログラミングHaskell(第2章)
プログラミングHaskell(第2章)
yaju88
 

Viewers also liked (20)

Sales Promotion & Supplementary Media
Sales Promotion & Supplementary MediaSales Promotion & Supplementary Media
Sales Promotion & Supplementary Media
Tayyab Ghafoor
 
Colormix 2013
Colormix 2013Colormix 2013
Colormix 2013
yurycolormix
 
Interactive powerpoint[1]
Interactive powerpoint[1]Interactive powerpoint[1]
Interactive powerpoint[1]
edtechfacey
 
впн в россии
впн в россиивпн в россии
впн в россии
19nature
 
Tips mengadakan majlis perkahwinan ros
Tips mengadakan majlis perkahwinan rosTips mengadakan majlis perkahwinan ros
Tips mengadakan majlis perkahwinan ros
Rose Katering
 
Analysis of magazine contents page
Analysis of magazine contents pageAnalysis of magazine contents page
Analysis of magazine contents page
jippy97
 
профориентация2вариант222м
профориентация2вариант222мпрофориентация2вариант222м
профориентация2вариант222м
Dimon Sizonenko
 
Презентация АППОМО
Презентация АППОМОПрезентация АППОМО
Презентация АППОМО
victory2011ru
 
фотоальбом(1 8кл)
фотоальбом(1 8кл)фотоальбом(1 8кл)
фотоальбом(1 8кл)
Dimon Sizonenko
 
ToR for the policy dialogue relative to the IYFF
ToR for the policy dialogue relative to the IYFFToR for the policy dialogue relative to the IYFF
ToR for the policy dialogue relative to the IYFF
Fatimata Kone
 
Stratégie Digitale CRT Centre-Val de Loire
Stratégie Digitale CRT Centre-Val de LoireStratégie Digitale CRT Centre-Val de Loire
Stratégie Digitale CRT Centre-Val de Loire
CRT-CENTRE
 
Presentation Mobi chem2014
Presentation Mobi chem2014Presentation Mobi chem2014
Presentation Mobi chem2014
Unifest
 
140 день святого николая-3класс
140 день святого николая-3класс140 день святого николая-3класс
140 день святого николая-3класс
Dimon Sizonenko
 
Epa regional dialogue
Epa regional dialogueEpa regional dialogue
Epa regional dialogue
Fatimata Kone
 
Rims 2013 saving the city
Rims 2013 saving the cityRims 2013 saving the city
Rims 2013 saving the city
Gary Eastes
 
Perk acties maart
Perk acties maartPerk acties maart
Perk acties maart
Jaap Kemp
 
Job announcement accountant assistant of ROPPA
Job announcement accountant assistant of ROPPAJob announcement accountant assistant of ROPPA
Job announcement accountant assistant of ROPPA
Fatimata Kone
 
Sales Promotion & Supplementary Media
Sales Promotion & Supplementary MediaSales Promotion & Supplementary Media
Sales Promotion & Supplementary Media
Tayyab Ghafoor
 
Interactive powerpoint[1]
Interactive powerpoint[1]Interactive powerpoint[1]
Interactive powerpoint[1]
edtechfacey
 
впн в россии
впн в россиивпн в россии
впн в россии
19nature
 
Tips mengadakan majlis perkahwinan ros
Tips mengadakan majlis perkahwinan rosTips mengadakan majlis perkahwinan ros
Tips mengadakan majlis perkahwinan ros
Rose Katering
 
Analysis of magazine contents page
Analysis of magazine contents pageAnalysis of magazine contents page
Analysis of magazine contents page
jippy97
 
профориентация2вариант222м
профориентация2вариант222мпрофориентация2вариант222м
профориентация2вариант222м
Dimon Sizonenko
 
Презентация АППОМО
Презентация АППОМОПрезентация АППОМО
Презентация АППОМО
victory2011ru
 
фотоальбом(1 8кл)
фотоальбом(1 8кл)фотоальбом(1 8кл)
фотоальбом(1 8кл)
Dimon Sizonenko
 
ToR for the policy dialogue relative to the IYFF
ToR for the policy dialogue relative to the IYFFToR for the policy dialogue relative to the IYFF
ToR for the policy dialogue relative to the IYFF
Fatimata Kone
 
Stratégie Digitale CRT Centre-Val de Loire
Stratégie Digitale CRT Centre-Val de LoireStratégie Digitale CRT Centre-Val de Loire
Stratégie Digitale CRT Centre-Val de Loire
CRT-CENTRE
 
Presentation Mobi chem2014
Presentation Mobi chem2014Presentation Mobi chem2014
Presentation Mobi chem2014
Unifest
 
140 день святого николая-3класс
140 день святого николая-3класс140 день святого николая-3класс
140 день святого николая-3класс
Dimon Sizonenko
 
Epa regional dialogue
Epa regional dialogueEpa regional dialogue
Epa regional dialogue
Fatimata Kone
 
Rims 2013 saving the city
Rims 2013 saving the cityRims 2013 saving the city
Rims 2013 saving the city
Gary Eastes
 
Perk acties maart
Perk acties maartPerk acties maart
Perk acties maart
Jaap Kemp
 
Job announcement accountant assistant of ROPPA
Job announcement accountant assistant of ROPPAJob announcement accountant assistant of ROPPA
Job announcement accountant assistant of ROPPA
Fatimata Kone
 

Similar to Java8 lambdas chapter1_2 (20)

Object-Funcational Analysis and design
Object-Funcational Analysis and designObject-Funcational Analysis and design
Object-Funcational Analysis and design
Tomoharu ASAMI
 
オブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programmingオブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programming
Tomoharu ASAMI
 
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Tomoharu ASAMI
 
Vim scriptとJavaとHaskell
Vim scriptとJavaとHaskellVim scriptとJavaとHaskell
Vim scriptとJavaとHaskell
aiya000
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックス
Tomoharu ASAMI
 
Java8から始める関数型プログラミング
Java8から始める関数型プログラミングJava8から始める関数型プログラミング
Java8から始める関数型プログラミング
stylefreeslide
 
Project lambda
Project lambdaProject lambda
Project lambda
Appresso Engineering Team
 
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!
Shohei Okada
 
Javascriptで学ぶ Functional Programming
Javascriptで学ぶ Functional ProgrammingJavascriptで学ぶ Functional Programming
Javascriptで学ぶ Functional Programming
todorokit
 
Java8勉強会
Java8勉強会Java8勉強会
Java8勉強会
賢太郎 前多
 
XPages 開発 Tips 百連発
XPages 開発 Tips 百連発XPages 開発 Tips 百連発
XPages 開発 Tips 百連発
Mitsuru Katoh
 
Ruby on Rails 入門
Ruby on Rails 入門Ruby on Rails 入門
Ruby on Rails 入門
Yasuko Ohba
 
PHPフレームワーク入門
PHPフレームワーク入門PHPフレームワーク入門
PHPフレームワーク入門
Sho A
 
ECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミング
TanUkkii
 
Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術
Naoki Aoyama
 
.NET Compiler Platform
.NET Compiler Platform.NET Compiler Platform
.NET Compiler Platform
信之 岩永
 
jjugccc2018 app review postmortem
jjugccc2018 app review postmortemjjugccc2018 app review postmortem
jjugccc2018 app review postmortem
tamtam180
 
エキ Py 読書会02 2章後半
エキ Py 読書会02 2章後半エキ Py 読書会02 2章後半
エキ Py 読書会02 2章後半
Tetsuya Morimoto
 
Object-Funcational Analysis and design
Object-Funcational Analysis and designObject-Funcational Analysis and design
Object-Funcational Analysis and design
Tomoharu ASAMI
 
オブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programmingオブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programming
Tomoharu ASAMI
 
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Tomoharu ASAMI
 
Vim scriptとJavaとHaskell
Vim scriptとJavaとHaskellVim scriptとJavaとHaskell
Vim scriptとJavaとHaskell
aiya000
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックス
Tomoharu ASAMI
 
Java8から始める関数型プログラミング
Java8から始める関数型プログラミングJava8から始める関数型プログラミング
Java8から始める関数型プログラミング
stylefreeslide
 
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!
Shohei Okada
 
Javascriptで学ぶ Functional Programming
Javascriptで学ぶ Functional ProgrammingJavascriptで学ぶ Functional Programming
Javascriptで学ぶ Functional Programming
todorokit
 
XPages 開発 Tips 百連発
XPages 開発 Tips 百連発XPages 開発 Tips 百連発
XPages 開発 Tips 百連発
Mitsuru Katoh
 
Ruby on Rails 入門
Ruby on Rails 入門Ruby on Rails 入門
Ruby on Rails 入門
Yasuko Ohba
 
PHPフレームワーク入門
PHPフレームワーク入門PHPフレームワーク入門
PHPフレームワーク入門
Sho A
 
ECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミング
TanUkkii
 
Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術
Naoki Aoyama
 
.NET Compiler Platform
.NET Compiler Platform.NET Compiler Platform
.NET Compiler Platform
信之 岩永
 
jjugccc2018 app review postmortem
jjugccc2018 app review postmortemjjugccc2018 app review postmortem
jjugccc2018 app review postmortem
tamtam180
 
エキ Py 読書会02 2章後半
エキ Py 読書会02 2章後半エキ Py 読書会02 2章後半
エキ Py 読書会02 2章後半
Tetsuya Morimoto
 

Java8 lambdas chapter1_2

  • 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. • マルチコア化で処理性能向上を目指す時代 • java.util.concurrent パッケージなどを使った並行処理には限界がある ⇒ ラムダ式を使った関数型プログラミングで簡潔、かつ強力な並行処理の実装 が書ける • 関数型言語の利点 • 可読性 • 保守性 • バグが少ない Why Did They Need To Change Java Again ?
  • 4. • 文字通り「関数」を使用したプログラミング • 入力した値に対して必ず同じ結果を返す • オブジェクト指向におけるメソッド(一連の手続きをまとめて名前を付けたもの) とは異なる • 関数の特徴 • 参照透過性 • ある関数に同じ入力値を与えれば、いつ評価しても必ず同じ値が得られる • 変数は一度定義したら二度と変えない(再代入操作で状態を書き換えない) • 第一級関数 • 変数に代入したり、別の関数の引数や戻り値になったりすることができる What Is Functional Programming ?
  • 5. Example Domain • 本全体を通して、例の提示には共通の問題領域として音楽が使 われる • 要約は以下の通り • アーティスト – 曲を作る個人やグループ • トラック • 一つの曲 • アルバム • 複数のトラックの集合 • 音楽は関数型プログラミングの手法を説明する際に使われる
  • 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. Key Points • ラムダ式は、データであるかのように振る舞いを実装でき、メソッド 名を省略できる • ラムダ式は、以下のように書くことができる • 関数型インターフェイスは定義されている抽象メソッドが1つだけ あるインターフェイスのことで、ラムダ式は、関数型インターフェイ スに対して適用することができる BinaryOperator<Integer> add = (x, y) -> x + y;