SlideShare a Scribd company logo
60分で体験する

Stream / Lambda

ハンズオン
gishi_yama
• 某地方大学でeラーニングなどの情報システムの

開発・研究に従事
• Wicket-Sapporo, Java Do ← New!
• Wicket User Guideの翻訳にチャレンジ中
https://github.com/wicket-sapporo/wicket_user_guide_jp
ハンズオンの概要
Java 8のリリースから1年あまりが経過し、Stream
APIやLambda 式が開発環境に導入される事例も次第
に増えてきていることと思います。
Stream APIやLamda式のしくみ・書き方・ルールの
基本と、これらを用いて既存のJavaコードをどう変
化させることができるのか、体験してみましょう。
3
練習・演習プロジェクト
https://github.com/java-­‐do/20150823_seminar
1. Download Zip をして展開(もしくはgitでclone)
2. stream20150823 フォルダをインポート
Eclipse:Existing Maven Project(既存のMavenプロジェクト)
NetBeans:プロジェクトを開く
3. 指示に従ってHandsOn.javaを編集し、ファイルを実行する
4. 解答例は Answer.java に記載されている
Stream / Lambda
Javaに細かい並列処理を導入するため、Java8から導
入されたAPIや記法のこと
• Stream:

配列、List、Set、Mapといったコレクション的な
オブジェクトへの順次・並列処理を記述するAPI
• Lambda:

匿名の関数オブジェクトを作るための関数型イン
ターフェースの実装(とその記法)
5
6
ages 22 10 19 38
たとえば、配列を表示する
‣ ages を要素数分繰り返す
‣ iを要素番号として、agesから要素を取り出す
‣ 取り出した要素を表示する
int[]	
  ages	
  =	
  new	
  int[]{22,	
  10,	
  19,	
  38};	
  
	
  	
  
for	
  (int	
  i	
  =	
  0;	
  i	
  <	
  ages.length;	
  i++)	
  {	
  
	
  	
  	
  	
  	
  	
  System.out.println(ages[i]);	
  
}
7
ages 22 10 19 38
たとえば、配列を表示する
Stream
int[]	
  ages	
  =	
  new	
  int[]{22,	
  10,	
  19,	
  38};	
  
	
  	
  
Arrays.stream(ages)	
  
	
  	
  .forEach(n	
  -­‐>	
  System.out.println(n));
‣ agesをstreamにする
‣ streamの要素nをSystem.out.println(n)で表示する
8


‣ ages を要素数分繰り返す
‣ iを要素番号として、agesから要素を取り出す
‣ 取り出した要素を表示する
‣ agesをstreamにする
‣ streamの要素nをSystem.out.println(n)で表示する
ages 22 10 19 38
たとえば、選んで表示する
‣ ages を要素数分繰り返す
‣ iを要素番号として、agesから要素:nを取り出す
‣ nが20以上の時だけ、下を実行する
‣ nを表示する
※20以上を表示
int[]	
  ages	
  =	
  new	
  int[]{22,	
  10,	
  19,	
  38};	
  
	
  	
  
for	
  (int	
  i	
  =	
  0;	
  i	
  <	
  ages.length;	
  i++)	
  {	
  
	
  	
  int	
  n	
  =	
  ages[i];	
  
	
  	
  if	
  (n	
  >=	
  20)	
  {	
  
	
  	
  	
  	
  System.out.println(n);	
  
	
  	
  }	
  
}
10
ages 22 10 19 38
たとえば、選んで表示する
Stream
‣ argsをStreamにする
‣ streamの要素nが20以上のものだけにフィルタする
‣ 残った要素nを表示する
※20以上を表示
int[]	
  ages	
  =	
  new	
  int[]{22,	
  10,	
  19,	
  38};	
  
	
  	
  
Arrays.stream(ages)	
  
	
  	
  	
  	
  	
  	
  .filter(n	
  -­‐>	
  n	
  >=	
  20)	
  //	
  22,	
  38のみのStreamができる	
  
	
  	
  	
  	
  	
  	
  .forEach(n	
  -­‐>	
  System.out.println(n));
11


‣ ages を要素数分繰り返す
‣ iを要素番号として、agesから要素:nを取り出す
‣ nが20以上の時だけ、下を実行する
‣ nを表示する
‣ argsをStreamにする
‣ streamの要素nが20以上のものだけにフィルタする
‣ 残った要素nを表示する
練習1を
やってみましょう
12
13
Streamの構造
int[]	
  ages	
  =	
  new	
  int[]{22,	
  10,	
  19,	
  38};	
  
Arrays.stream(ages)	
  
	
  	
  	
  	
  	
  	
  .filter(n	
  -­‐>	
  n	
  >=	
  20)
	
  	
  	
  	
  	
  	
  .forEach(n	
  -­‐>	
  System.out.println(n));	
  
‣ 終端操作が実行されるときに、パイプラインの全てが実行される
‣ それぞれにどのような種類があるのかは

@hisidamaさんの

http://www.ne.jp/asahi/hishidama/home/tech/java/
stream.html#h_method がわかりやすい
ストリーム・パイプライン
14
ages 22 10 19 38
並列処理
Stream
※20以上を表示
int[]	
  ages	
  =	
  new	
  int[]{22,	
  10,	
  19,	
  38};	
  
	
  	
  
Arrays.stream(ages)	
  
	
  	
  	
  	
  	
  	
  .parallel()	
  
	
  	
  	
  	
  	
  	
  .filter(n	
  -­‐>	
  n	
  >=	
  20)	
  	
  
	
  	
  	
  	
  	
  	
  .forEach(n	
  -­‐>	
  System.out.println(n));
streamをparallel streamに変化させるだけで、

並列処理になる
※順序保証だとパフォーマンスは下がる
15
ages 22 10 19 38
要素の入れ替え
Stream
map、mapToXXというメソッドで、要素を入れ替えた
Streamを生成し、処理を継続する
Arrays.stream(ages)	
  
	
  	
  	
  	
  	
  	
  .filter(n	
  -­‐>	
  n	
  >=	
  20)	
  //	
  22,	
  38のみのStreamができる	
  
	
  	
  	
  	
  	
  	
  .mapToObj(n	
  -­‐>	
  Integer.toBinaryString(n))	
  	
  
	
  	
  	
  	
  	
  	
  	
  //	
  2進数化したStreamができる	
  
	
  	
  	
  	
  	
  	
  .forEach(n	
  -­‐>	
  System.out.println(n));
16
Lambda式
・n	
  -­‐>	
  n	
  >=	
  20	
  
・n	
  -­‐>	
  Integer.toBinaryString(n)	
  
・n	
  -­‐>	
  System.out.println(n)
Streamの中に現れた
これらが Lambda(ラムダ)式。
ラムダ式は、 式 の様に処理(関数)を書ける
「関数オブジェクト」
Javaでは、関数型インターフェースの無名クラスが原型
無名クラス
インスタンス化の際に{}をつけることで、サブクラスやインター
フェースの実装クラスのオブジェクトをその場で作ることができる。
このサブクラスには、クラス名がない。
この手法(と、作られたクラス)を無名クラスという。
public	
  class	
  GamePlayer	
  extends	
  AbstractPlayer	
  {	
  
	
  	
  //	
  AbstractPlayerのサブクラス
	
  	
  //	
  このサブクラスには GamePlayer というクラス名前がある	
  
}
AbstractPlayer	
  player	
  =	
  new	
  AbstractPlayer()	
  {	
  
	
  	
  //	
  このオブジェクトは、AbstractPlayerのサブクラスのオブジェクトとなる
	
  	
  //	
  サブクラスにはクラス名が存在しないので、無名クラスと呼ばれる	
  
};
↓通常のサブクラス↑無名クラス
関数型インターフェース










18
int[]	
  ages	
  =	
  new	
  int[]{22,	
  10,	
  19,	
  38};	
  
IntConsumer	
  consumer	
  =	
  new	
  IntConsumer()	
  {	
  
//	
  Consumerの無名クラス	
  
	
  	
  @Override	
  
	
  	
  public	
  void	
  accept(int	
  n)	
  {	
  
	
  	
  	
  	
  System.out.println(n);	
  
	
  	
  }	
  
};	
  
	
  	
  
Arrays.stream(ages)	
  
	
  	
  	
  	
  	
  	
  .forEach(consumer); 
例:配列を表示する終端操作の
Consumerの無名クラス
int[]	
  ages	
  =	
  new	
  int[]{22,	
  10,	
  19,	
  38};	
  
IntConsumer	
  consumer	
  =	
  new	
  IntConsumer()	
  {	
  
//	
  Consumerの無名クラス	
  
	
  	
  @Override	
  
	
  	
  public	
  void	
  accept(int	
  n)	
  {	
  
	
  	
  	
  	
  System.out.println(n);	
  
	
  	
  }	
  
};	
  
	
  	
  
Arrays.stream(ages)	
  
	
  	
  	
  	
  	
  	
  .forEach(consumer); 
無名クラスからラムダ式へ
int[]	
  ages	
  =	
  new	
  int[]{22,	
  10,	
  19,	
  38};	
  
IntConsumer	
  consumer	
  =	
  
	
  n	
  -­‐>	
  System.out.println(n);	
  
	
  	
  
Arrays.stream(ages)	
  
	
  	
  	
  	
  	
  	
  .forEach(consumer); 
ラムダ式
int[]	
  ages	
  =	
  new	
  int[]{22,	
  10,	
  19,	
  38};	
  
IntConsumer	
  consumer	
  =	
  
	
  n	
  -­‐>	
  System.out.println(n);	
  
Arrays.stream(ages)	
  
	
  	
  	
  	
  	
  	
  .forEach(n	
  -­‐>	
  System.out.println(n)); 
引数に直接渡す
アロー演算子の左辺が複数行
になるときは{}で囲む
int[]	
  ages	
  =	
  new	
  int[]{22,	
  10,	
  19,	
  38};	
  
Arrays.stream(ages)	
  
	
  	
  .forEach(n	
  -­‐>	
  {	
  
	
  	
  	
  	
  String	
  s	
  =	
  n	
  +	
  "歳";	
  
	
  	
  	
  	
  System.out.println(s);	
  
	
  	
  });	
  
練習2
演習1∼10を
やってみましょう
24
List<String>	
  choiced	
  =	
  profiles.stream()	
  
	
  	
  .filter(p	
  -­‐>	
  p.isFamale())	
  
	
  	
  .filter(p	
  -­‐>	
  p.isAdult())	
  
	
  	
  .map(p	
  -­‐>	
  p.getName())	
  
	
  	
  .forEach(i	
  -­‐>	
  System.out.println(i));
List<String>	
  choiced	
  =	
  profiles.stream()	
  
	
  	
  .filter(Profile::isFamale)	
  
	
  	
  .filter(Profile::isAdult)	
  
	
  	
  .map(Profile::getName)	
  
	
  	
  .forEach(System.out::println);
メソッド参照
ラムダ式の部分を
オブジェクト::メソッド名
クラス::メソッド名
に書き換えられる(引数も推測される)
副作用は(極力)避ける
StringJoiner	
  joiner	
  =	
  new	
  StringJoiner(",",	
  "Profile{",	
  "}");	
  
Stream.of(name,	
  sex.toString(),	
  age.toString(),	
  state,	
  policy)	
  
	
  	
  .forEach(joiner::add);
StringJoiner	
  joiner	
  =	
  new	
  StringJoiner(",",	
  "Profile{",	
  "}");	
  
Stream.of(name,	
  sex.toString(),	
  age.toString(),	
  state,	
  policy)	
  
	
  	
  .parallel()	
  
	
  	
  .forEach(joiner::add);
joiner に変化(副作用)を与えるStream
上(順次処理)と下(並列処理)で結果が異なる!
やむをえない場合もあるが、副作用のある処理は極力さけることで、
エラーの防止や並列化をしやすくなる
※なお、ラムダ式の名で呼び出される変数は暗黙的にfinalとなる

 (上の例では、joinerがfinalとして扱われる)
まとめ
27
まとめ
Stream:	
  コレクション的なオブジェクトへの順次・並列
処理をパイプラインで記述できる	
  
Lambda:	
  関数型インターフェースの実装(Stream内で

処理させたい内容など)を式やメソッド参照で書ける	
  
Stream	
  API	
  /	
  Lambdaを使うことで、for文を使う処理

をより明確に・簡素に書ける	
  
streamをparallel化するだけで並列処理を行わせること
ができるようになる(副作用の有無に注意)
Wicketも将来的には…
Martijn Dashorst(2015). Apache Wicket 10 years beyond
参考文献
・Javaによる関数型プログラミング(ISBN:4873117046)
・Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング
(ISBN:4844336673)
参考文献
・きつねさんと学ぶ Lambda式&StreamAPIハンズオン
http://www.slideshare.net/bitter_fox/handson-50579009

https://bitbucket.org/bitter_fox/lambda.git
・ひしだまのホームページ:Java Stream
http://www.ne.jp/asahi/hishidama/home/tech/java/stream.html
・Java8のstreamを使いこなす:きしだのはてな
http://d.hatena.ne.jp/nowokay/20130504
・JavaのStreamで学ぶ遅延処理実装パターン
http://www.slideshare.net/mikeneck/javastream
・社内Java8勉強会 ラムダ式とストリームAPI
http://www.slideshare.net/zoetrope/java8-lambdaandstream
・Apache Wicket 10 years beyond
http://www.slideshare.net/dashorst/wicket-10-years-and-beyond

More Related Content

PDF
Java SE 8 lambdaで変わる プログラミングスタイル
PPT
Awt and swing in java
PDF
徹底解説!Project Lambdaのすべて リターンズ[祝Java8Launch #jjug]
PDF
今こそStream API入門
PDF
Java 8 features
PDF
Spring Boot
PPTX
さくっと理解するSpring bootの仕組み
PDF
サーバーサイドでの非同期処理で色々やったよ
Java SE 8 lambdaで変わる プログラミングスタイル
Awt and swing in java
徹底解説!Project Lambdaのすべて リターンズ[祝Java8Launch #jjug]
今こそStream API入門
Java 8 features
Spring Boot
さくっと理解するSpring bootの仕組み
サーバーサイドでの非同期処理で色々やったよ

What's hot (20)

PPTX
Spring Webflux
PDF
Spring Boot
PDF
PPSX
Elements of Java Language
PDF
例外設計における大罪
PDF
入社1年目のプログラミング初心者がSpringを学ぶための手引き
PDF
磯野ー!関数型言語やろうぜー!
PPTX
Introduction to java
PPT
Ionic Framework
PDF
Mavenの真実とウソ
PDF
Real Life Clean Architecture
PPTX
Clean architecture
PDF
Spring Framework - Core
PPTX
Chapter 3 servlet & jsp
PPT
Présentation jQuery pour débutant
PDF
Domain Driven Design with the F# type System -- F#unctional Londoners 2014
PDF
動的なILの生成と編集
PPTX
Introduction to Spring Framework
PPT
試験にでるSpring
Spring Webflux
Spring Boot
Elements of Java Language
例外設計における大罪
入社1年目のプログラミング初心者がSpringを学ぶための手引き
磯野ー!関数型言語やろうぜー!
Introduction to java
Ionic Framework
Mavenの真実とウソ
Real Life Clean Architecture
Clean architecture
Spring Framework - Core
Chapter 3 servlet & jsp
Présentation jQuery pour débutant
Domain Driven Design with the F# type System -- F#unctional Londoners 2014
動的なILの生成と編集
Introduction to Spring Framework
試験にでるSpring
Ad

Viewers also liked (20)

PDF
Apache Wicket and Java EE sitting in a tree
PPT
Wicket体験談
PDF
PDF
Java Community Process(JCP)ミーティング
PDF
Apache Wicket: Web Applications With Just Java
PDF
逆戻りデバッグ補助のための嵌入的スパイの試作
PDF
chat bot framework for Java8
PDF
地方私立大の助教が Apache Wicketの勉強会を
開いたら
PDF
札幌のJavaコミュニティ Java Doを立ち上げた話
PDF
プログラミング言語に関する学生へのアンケート
PDF
Mautic導入ポイントと初期設定(Windows+Bitnami Mautic Stack)
PDF
WordPress でプロフィールサイトをつくってみた
PDF
Wicket with Spring Boot on Azure
PDF
Apache Wicketのユニットテスト機能
PDF
Lombok ハンズオン
PPTX
kintone アプリ & バーコード活用 & Excel 連携
PDF
Review the OOCSS
PDF
20160215 04 java ee7徹底入門 jbatch
PDF
The Zillow Zero Marketing Strategy
PPTX
MA(マーケティングオートメーション)初心者運用のススメ
Apache Wicket and Java EE sitting in a tree
Wicket体験談
Java Community Process(JCP)ミーティング
Apache Wicket: Web Applications With Just Java
逆戻りデバッグ補助のための嵌入的スパイの試作
chat bot framework for Java8
地方私立大の助教が Apache Wicketの勉強会を
開いたら
札幌のJavaコミュニティ Java Doを立ち上げた話
プログラミング言語に関する学生へのアンケート
Mautic導入ポイントと初期設定(Windows+Bitnami Mautic Stack)
WordPress でプロフィールサイトをつくってみた
Wicket with Spring Boot on Azure
Apache Wicketのユニットテスト機能
Lombok ハンズオン
kintone アプリ & バーコード活用 & Excel 連携
Review the OOCSS
20160215 04 java ee7徹底入門 jbatch
The Zillow Zero Marketing Strategy
MA(マーケティングオートメーション)初心者運用のススメ
Ad

Similar to 60分で体験する Stream / Lambda
 ハンズオン (20)

PPTX
【java8 勉強会】 怖くない!ラムダ式, Stream API
PDF
社内Java8勉強会 ラムダ式とストリームAPI
PDF
きつねさんと学ぶ Lambda式&StreamAPIハンズオン[関ジャバ2015/7/11] #kanjava
PDF
The Why and How of Java8 at LINE Fukuoka
PPTX
3月度定例会プレゼン資料 張田浩明 最新
PPTX
PDF
ゆるふわJava8入門
PPTX
Java8勉強会
PDF
Java8 lambdas chap03
PPTX
JavaDayTokyo2015 [3-1]
PPTX
Java8から始める関数型プログラミング
PPTX
Java8 Lambda chapter5
PDF
【社内勉強会#9】(今更ながら)java8触ってみた~ラムダ式篇~
ODP
Vim scriptとJavaとHaskell
PDF
JavaのStreamで学ぶ遅延処理実装パターン
PDF
Javaセキュアコーディングセミナー東京第3回講義
PDF
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
PDF
On stream-lazy-computation
PDF
Java初心者がJava8のラムダ式をやってみた
PDF
HiroshimaJUG の 「Java8 Lambda ハンズオン with すごい広島」 を5分で振り返る
【java8 勉強会】 怖くない!ラムダ式, Stream API
社内Java8勉強会 ラムダ式とストリームAPI
きつねさんと学ぶ Lambda式&StreamAPIハンズオン[関ジャバ2015/7/11] #kanjava
The Why and How of Java8 at LINE Fukuoka
3月度定例会プレゼン資料 張田浩明 最新
ゆるふわJava8入門
Java8勉強会
Java8 lambdas chap03
JavaDayTokyo2015 [3-1]
Java8から始める関数型プログラミング
Java8 Lambda chapter5
【社内勉強会#9】(今更ながら)java8触ってみた~ラムダ式篇~
Vim scriptとJavaとHaskell
JavaのStreamで学ぶ遅延処理実装パターン
Javaセキュアコーディングセミナー東京第3回講義
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
On stream-lazy-computation
Java初心者がJava8のラムダ式をやってみた
HiroshimaJUG の 「Java8 Lambda ハンズオン with すごい広島」 を5分で振り返る

60分で体験する Stream / Lambda
 ハンズオン