Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
EN
Uploaded by
なおき きしだ
PDF, PPTX
18,065 views
Java SE 8 lambdaで変わる プログラミングスタイル
福岡JavaOne2013報告会第2弾でのプレゼン ラムダ構文の文法よりも、その使い方とプログラミングスタイルについてを主にまとめました。
Technology
◦
News & Politics
◦
Read more
27
Save
Share
Embed
Embed presentation
Download
Download as PDF, PPTX
1
/ 48
2
/ 48
3
/ 48
4
/ 48
5
/ 48
6
/ 48
7
/ 48
8
/ 48
9
/ 48
10
/ 48
11
/ 48
12
/ 48
13
/ 48
14
/ 48
15
/ 48
16
/ 48
17
/ 48
18
/ 48
19
/ 48
20
/ 48
21
/ 48
22
/ 48
23
/ 48
24
/ 48
25
/ 48
26
/ 48
27
/ 48
28
/ 48
29
/ 48
30
/ 48
31
/ 48
32
/ 48
33
/ 48
34
/ 48
35
/ 48
36
/ 48
37
/ 48
38
/ 48
39
/ 48
40
/ 48
41
/ 48
42
/ 48
43
/ 48
44
/ 48
45
/ 48
46
/ 48
47
/ 48
48
/ 48
More Related Content
PPTX
【java8 勉強会】 怖くない!ラムダ式, Stream API
by
dcomsolution
PDF
60分で体験する Stream / Lambda ハンズオン
by
Hiroto Yamakawa
PPTX
Java Puzzlers JJUG CCC 2016
by
Yoshio Terada
PDF
from old Java to modern Java
by
心 谷本
PDF
Java8のstreamをダラダラまとめてみる
by
Shinya Mochida
PDF
Shibuya JVM Groovy 20150418
by
Uehara Junji
PDF
Java x Groovy: improve your java development life
by
Uehara Junji
PDF
講座Java入門
by
Tokai University
【java8 勉強会】 怖くない!ラムダ式, Stream API
by
dcomsolution
60分で体験する Stream / Lambda ハンズオン
by
Hiroto Yamakawa
Java Puzzlers JJUG CCC 2016
by
Yoshio Terada
from old Java to modern Java
by
心 谷本
Java8のstreamをダラダラまとめてみる
by
Shinya Mochida
Shibuya JVM Groovy 20150418
by
Uehara Junji
Java x Groovy: improve your java development life
by
Uehara Junji
講座Java入門
by
Tokai University
What's hot
PDF
from old java to java8 - KanJava Edition
by
心 谷本
PDF
Java puzzlers 2013 at JavaFesta Japan
by
Yoshio Terada
PDF
並行プログラミングと継続モナド
by
Kousuke Ruichi
PPTX
Java8勉強会
by
賢太郎 前多
PDF
社内Java8勉強会 ラムダ式とストリームAPI
by
Akihiro Ikezoe
PPTX
Visual C++で使えるC++11
by
nekko1119
PDF
組み込みでこそC++を使う10の理由
by
kikairoya
PDF
15分でざっくり分かるScala入門
by
SatoYu1ro
PPTX
BoostAsioで可読性を求めるのは間違っているだろうか
by
Yuki Miyatake
PDF
JavaScript 講習会 #1
by
Susisu
PDF
C++14 Overview
by
Akira Takahashi
PDF
おいしいLisp
by
Kent Ohashi
PDF
Thinking in Cats
by
Eugene Yokota
PDF
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
by
なおき きしだ
PDF
あなたのScalaを爆速にする7つの方法(日本語版)
by
x1 ichi
PDF
関数型プログラミング in javascript
by
Ryuma Tsukano
PDF
Functional Way
by
Kent Ohashi
PDF
Frege, What a Non-strict Language
by
y_taka_23
PDF
Javaセキュアコーディングセミナー東京第3回講義
by
JPCERT Coordination Center
PDF
Lisp Tutorial for Pythonista : Day 3
by
Ransui Iso
from old java to java8 - KanJava Edition
by
心 谷本
Java puzzlers 2013 at JavaFesta Japan
by
Yoshio Terada
並行プログラミングと継続モナド
by
Kousuke Ruichi
Java8勉強会
by
賢太郎 前多
社内Java8勉強会 ラムダ式とストリームAPI
by
Akihiro Ikezoe
Visual C++で使えるC++11
by
nekko1119
組み込みでこそC++を使う10の理由
by
kikairoya
15分でざっくり分かるScala入門
by
SatoYu1ro
BoostAsioで可読性を求めるのは間違っているだろうか
by
Yuki Miyatake
JavaScript 講習会 #1
by
Susisu
C++14 Overview
by
Akira Takahashi
おいしいLisp
by
Kent Ohashi
Thinking in Cats
by
Eugene Yokota
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
by
なおき きしだ
あなたのScalaを爆速にする7つの方法(日本語版)
by
x1 ichi
関数型プログラミング in javascript
by
Ryuma Tsukano
Functional Way
by
Kent Ohashi
Frege, What a Non-strict Language
by
y_taka_23
Javaセキュアコーディングセミナー東京第3回講義
by
JPCERT Coordination Center
Lisp Tutorial for Pythonista : Day 3
by
Ransui Iso
Viewers also liked
PDF
ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)
by
Yuuki Fukuda
PDF
勉強会に参加しないと不幸になる話
by
なおき きしだ
PPTX
ぼくの実装した最弱のディープラーニング
by
なおき きしだ
PDF
だれも教えてくれないJavaの世界。 あと、ぼくが会社員になったわけ。
by
なおき きしだ
PPTX
乱数のたのしい話
by
なおき きしだ
PPT
Java9新機能概要
by
HonMarkHunt
PDF
10のJava9で変わるJava8の嫌なとこ!
by
bitter_fox
PDF
JavaOne2016報告
by
なおき きしだ
PDF
JJUG CCC 2014 fall Javaが見るニュータイプの夢
by
なおき きしだ
PDF
NetBeansのメモリ使用ログから機械学習できしだが働いてるかどうか判定する
by
なおき きしだ
PDF
Javaプログラミング入門
by
なおき きしだ
PDF
そろそろJavaみなおしてもええんやで
by
なおき きしだ
PPTX
Effective java 輪読会 第6章 項目30-31
by
Appresso Engineering Team
PPTX
Effective java 輪読会 第6章 項目32-34
by
Appresso Engineering Team
PDF
職業人講和20140403
by
なおき きしだ
PDF
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
by
なおき きしだ
PDF
JavaOne2015報告またはこれからのJava
by
なおき きしだ
PDF
Javaでのバリデーション 〜Bean Validation篇〜
by
eiryu
PDF
コンピューティングとJava~なにわTECH道
by
なおき きしだ
PDF
2009/12/10 GPUコンピューティングの現状とスーパーコンピューティングの未来
by
Preferred Networks
ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)
by
Yuuki Fukuda
勉強会に参加しないと不幸になる話
by
なおき きしだ
ぼくの実装した最弱のディープラーニング
by
なおき きしだ
だれも教えてくれないJavaの世界。 あと、ぼくが会社員になったわけ。
by
なおき きしだ
乱数のたのしい話
by
なおき きしだ
Java9新機能概要
by
HonMarkHunt
10のJava9で変わるJava8の嫌なとこ!
by
bitter_fox
JavaOne2016報告
by
なおき きしだ
JJUG CCC 2014 fall Javaが見るニュータイプの夢
by
なおき きしだ
NetBeansのメモリ使用ログから機械学習できしだが働いてるかどうか判定する
by
なおき きしだ
Javaプログラミング入門
by
なおき きしだ
そろそろJavaみなおしてもええんやで
by
なおき きしだ
Effective java 輪読会 第6章 項目30-31
by
Appresso Engineering Team
Effective java 輪読会 第6章 項目32-34
by
Appresso Engineering Team
職業人講和20140403
by
なおき きしだ
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
by
なおき きしだ
JavaOne2015報告またはこれからのJava
by
なおき きしだ
Javaでのバリデーション 〜Bean Validation篇〜
by
eiryu
コンピューティングとJava~なにわTECH道
by
なおき きしだ
2009/12/10 GPUコンピューティングの現状とスーパーコンピューティングの未来
by
Preferred Networks
Similar to Java SE 8 lambdaで変わる プログラミングスタイル
PPTX
Project lambda
by
Appresso Engineering Team
PDF
たのしい関数型
by
Shinichi Kozake
PDF
F#入門 ~関数プログラミングとは何か~
by
Nobuhisa Koizumi
PDF
関数型プログラミング入門 with OCaml
by
Haruka Oikawa
PDF
Javaセキュアコーディングセミナー東京第1回演習の解説
by
JPCERT Coordination Center
PDF
Material
by
_TUNE_
PDF
Java初心者勉強会(2015/08/07)資料
by
Toshio Ehara
PDF
第2回関数型言語勉強会 大阪
by
Naoki Kitora
PDF
Javaセキュアコーディングセミナー東京第4回講義
by
JPCERT Coordination Center
PDF
wakuwaku Scala ~Scala入門勉強会~ 資料
by
Mizuki Yamanaka
PDF
Java8 lambdas chap03
by
ohtsuchi
PDF
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
by
Ouka Yuka
PPTX
関数型言語&形式的手法セミナー(3)
by
啓 小笠原
PDF
ゆるふわJava8入門
by
dcubeio
PDF
Effective java 勉強会
by
Takinami Kei
PPTX
Java8 Lambda chapter5
by
Takinami Kei
PDF
プログラムの処方箋~健康なコードと病んだコード
by
Shigenori Sagawa
PDF
Javaセキュアコーディングセミナー東京第3回演習の解説
by
JPCERT Coordination Center
PDF
BOF1-Scala02.pdf
by
Hiroshi Ono
PDF
BOF1-Scala02.pdf
by
Hiroshi Ono
Project lambda
by
Appresso Engineering Team
たのしい関数型
by
Shinichi Kozake
F#入門 ~関数プログラミングとは何か~
by
Nobuhisa Koizumi
関数型プログラミング入門 with OCaml
by
Haruka Oikawa
Javaセキュアコーディングセミナー東京第1回演習の解説
by
JPCERT Coordination Center
Material
by
_TUNE_
Java初心者勉強会(2015/08/07)資料
by
Toshio Ehara
第2回関数型言語勉強会 大阪
by
Naoki Kitora
Javaセキュアコーディングセミナー東京第4回講義
by
JPCERT Coordination Center
wakuwaku Scala ~Scala入門勉強会~ 資料
by
Mizuki Yamanaka
Java8 lambdas chap03
by
ohtsuchi
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
by
Ouka Yuka
関数型言語&形式的手法セミナー(3)
by
啓 小笠原
ゆるふわJava8入門
by
dcubeio
Effective java 勉強会
by
Takinami Kei
Java8 Lambda chapter5
by
Takinami Kei
プログラムの処方箋~健康なコードと病んだコード
by
Shigenori Sagawa
Javaセキュアコーディングセミナー東京第3回演習の解説
by
JPCERT Coordination Center
BOF1-Scala02.pdf
by
Hiroshi Ono
BOF1-Scala02.pdf
by
Hiroshi Ono
More from なおき きしだ
PDF
GraalVMの紹介とTruffleでPHPぽい言語を実装したら爆速だった話
by
なおき きしだ
PDF
GraalVM at Fukuoka LT
by
なおき きしだ
PDF
これからのコンピューティングの変化とこれからのプログラミング in 福岡 2018/12/8
by
なおき きしだ
PDF
GraalVMについて
by
なおき きしだ
PDF
VRカメラが楽しいのでブラウザで見たくなった話
by
なおき きしだ
PDF
最近のJava事情
by
なおき きしだ
PDF
怖いコードの話 2018/7/18
by
なおき きしだ
PDF
Java新機能観察日記 - JJUGナイトセミナー
by
なおき きしだ
PDF
プログラマになるためになにを勉強するか at 九州学生エンジニアLT大会
by
なおき きしだ
PDF
これからのコンピューティングの変化とこれからのプログラミング at 広島
by
なおき きしだ
PDF
Summary of JDK10 and What will come into JDK11
by
なおき きしだ
PDF
Summary of JDK10 and What will come into JDK11
by
なおき きしだ
PDF
Java10 and Java11 at JJUG CCC 2018 Spr
by
なおき きしだ
PPTX
New thing in JDK10 even that scala-er should know
by
なおき きしだ
PPTX
Java Release Model (on Scala Matsuri)
by
なおき きしだ
PDF
これからのJava言語と実行環境
by
なおき きしだ
PDF
JavaOne報告2017
by
なおき きしだ
PDF
JavaOne2017で感じた、Javaのいまと未来 in 大阪
by
なおき きしだ
PPTX
人工知能に何ができないか
by
なおき きしだ
PDF
機械学習プロ生20151121
by
なおき きしだ
GraalVMの紹介とTruffleでPHPぽい言語を実装したら爆速だった話
by
なおき きしだ
GraalVM at Fukuoka LT
by
なおき きしだ
これからのコンピューティングの変化とこれからのプログラミング in 福岡 2018/12/8
by
なおき きしだ
GraalVMについて
by
なおき きしだ
VRカメラが楽しいのでブラウザで見たくなった話
by
なおき きしだ
最近のJava事情
by
なおき きしだ
怖いコードの話 2018/7/18
by
なおき きしだ
Java新機能観察日記 - JJUGナイトセミナー
by
なおき きしだ
プログラマになるためになにを勉強するか at 九州学生エンジニアLT大会
by
なおき きしだ
これからのコンピューティングの変化とこれからのプログラミング at 広島
by
なおき きしだ
Summary of JDK10 and What will come into JDK11
by
なおき きしだ
Summary of JDK10 and What will come into JDK11
by
なおき きしだ
Java10 and Java11 at JJUG CCC 2018 Spr
by
なおき きしだ
New thing in JDK10 even that scala-er should know
by
なおき きしだ
Java Release Model (on Scala Matsuri)
by
なおき きしだ
これからのJava言語と実行環境
by
なおき きしだ
JavaOne報告2017
by
なおき きしだ
JavaOne2017で感じた、Javaのいまと未来 in 大阪
by
なおき きしだ
人工知能に何ができないか
by
なおき きしだ
機械学習プロ生20151121
by
なおき きしだ
Java SE 8 lambdaで変わる プログラミングスタイル
1.
Java SE 8
lambdaで変わる プログラミングスタイル 2013/11/15 きしだなおき
2.
ラムダがきたよ ● ● ● 匿名関数 関数型スタイルには必須 流行!
3.
JavaOneでのラムダ ● ● ● 関連セッションが大人気!! どのセッションも行列!! 人数オーバーで入れない!!
4.
ラムダの目的 ● ● 建前:並列化 本音:Cool!!
5.
ラムダ構文 ● ● ● ● 関数型インタフェース ラムダ記法 メソッド参照 interfaceのデフォルトメソッド
6.
関数型インタフェース ● 実装すべきメソッドがひとつだけのインタフェース – Runnable ● – ActionListener ● ● 実装すべきメソッド:run() 実装すべきメソッド:actionPerformed(ActionEvent) @FuncationalInterfaceで検査可能
7.
用意された関数型インタフェース http://d.hatena.ne.jp/nowokay/20130824#1377300917
8.
ラムダ構文の基礎 ActionListener al =
new ActionListener() { @Override public void actionPerformed(ActionEvent e) { taOutput.append(txtMessage.getText() + "n"); } };
9.
ラムダ構文の基礎 ActionListener al =
new ActionListener() { @Override public void actionPerformed(ActionEvent e) { taOutput.append(txtMessage.getText() + "n"); } }; インタフェース名やメソッド名は推論される
10.
ラムダ構文の基礎 ActionListener al =
new ActionListener() { @Override public void actionPerformed(ActionEvent e) { taOutput.append(txtMessage.getText() + "n"); } }; 引数とメソッド本体の間に「->」が入る ->
11.
ラムダ構文の基礎 ActionListener al =
new ActionListener() { @Override public void actionPerformed(ActionEvent e) { taOutput.append(txtMessage.getText() + "n"); } }; ActionListener al = (ActionEvent e) -> { taOutput.append(txtMessage.getText() + "n"); }; ->
12.
ラムダ構文の基礎 ● IDEで変換
13.
ラムダ構文の基礎 ActionListener al =
new ActionListener() { @Override public void actionPerformed(ActionEvent e) { taOutput.append(txtMessage.getText() + "n"); } }; ActionListener al = (ActionEvent e) -> { taOutput.append(txtMessage.getText() + "n"); }; 引数の型も省略できる ->
14.
ラムダ構文の基礎 ActionListener al =
new ActionListener() { @Override public void actionPerformed(ActionEvent e) { taOutput.append(txtMessage.getText() + "n"); } }; ActionListener al = (ActionEvent e) -> { taOutput.append(txtMessage.getText() + "n"); }; 引数がひとつならカッコが省略できる ->
15.
ラムダ構文の基礎 ActionListener al =
new ActionListener() { @Override public void actionPerformed(ActionEvent e) { taOutput.append(txtMessage.getText() + "n"); } }; ActionListener al = (ActionEvent e) -> { taOutput.append(txtMessage.getText() + "n"); }; 本文が一行ならカッコとセミコロンが省略できる (return文のときはreturnも省略) ->
16.
ラムダ構文の基礎 ActionListener al =
new ActionListener() { @Override public void actionPerformed(ActionEvent e) { taOutput.append(txtMessage.getText() + "n"); } }; ActionListener al = e ->taOutput.append(txtMessage.getText() + "n"); ->
17.
メソッド参照 ● 引数ひとつのインスタンスメソッド – ● インスタンス::メソッド 引数ひとつのstaticメソッド 引数なしのインスタンスメソッド – クラス::メソッド public void init()
{ btnInput.addActionListener(this::inputClicked); } public void inputClicked(ActionEvent ae){ taOutput.append(txtMessage.getText() + "n"); }
18.
デフォルトメソッド ● Listなどへのラムダ対応が必要 ● interfaceがメソッドをもてる ● ついでに多重継承もできる @FunctionalInterface interface Hoge{ String foo(); default
void bar(){ System.out.println(foo() + "ですってバー"); } } void proc(){ Hoge h = () -> "やあ"; h.bar(); }
19.
Stream ● 外部イテレーションから内部イテレーションへ – 外部イテレーション(for) – 内部イテレーション(Stream)
20.
Stream 外部イテレーション for(String s :
strs){ if(!s.startsWith("h")){ continue; } String u = s.toUpperCase(); System.out.println(u); } 内部イテレーション strs.stream() .filter(s -> s.startsWith("h")) .map(s -> s.toUpperCase()) .forEach(System.out::println);
21.
操作種別 ● ソース – ● 中間操作 – ● 操作対象になる 他のStreamを生成する 終端操作 – 結果の実行
22.
ソース ソース 並列性 特徴 ArrayList、配列 良い SIZED, ORDERED LinkedList 悪い SIZED, ORDERED HashSet まあまあ SIZED,
DISTINCT TreeSet まあまあ SIZED, DISTINCT, SORTED, ORDERED IntStream.range 良い SIZED, DISTINCT, SORTED, ORDERED BufferedReader.lines 悪い ORDERED 特徴 説明 SIZED サイズが決まっている DISTINCT 重複なし ORDERED 順番つき SORTED 整列済
23.
中間操作 操作 効果 追記 fiter() SIZEDがはずれる map() DISTINCT, SORTEDがはずれる sorted() SORTED, ORDEREDが追加 SORTEDならなにもしない distinct() DISTINCTが追加 DISTINCTならなにもしない limit() すべてそのまま
24.
終端操作 集計 toArray reduce collect sum,min,max,count anyMatch, allMatch イテレーション forEach 検索 findFirst findAny
25.
プログラムモデルの変化 ● ● ● ● ● ● リダクション(畳み込み) 並列処理 遅延実行 無限ストリーム メモ化(実行結果キャッシュ) null排除
26.
リダクション(畳み込み) ● ストリームの値をひとつにまとめる 3 5 3 8 6 1 3 9 38 int s =
IntStream.of(3, 5, 3, 8, 6, 1, 3, 9) .sum();
27.
リダクション:集計 int[] ar =
{3, 5, 3, 8, 6, 1, 3, 9}; int total = 0; for(int i : ar){ total += i; } System.out.println(total); int[] ar = {3, 5, 3, 8, 6, 1, 3, 9}; System.out.println(Arrays.stream(ar).sum());
28.
リダクションリスト変換 List<Integer> al =
Arrays.asList(3, 5, 3, 8, 6, 1, 3, 9); List<Integer> pows = new ArrayList<>(); for(int i : al){ if(i >= 5){ continue; } int pow = i * i; pows.add(pow); } List<Integer> al = Arrays.asList(3, 5, 3, 8, 6, 1, 3, 9); List<Integer> pows = al.stream() .filter(i -> i < 5) .map(i -> i * i) .collect(Collectors.toList());
29.
リダクション:判定 List<Integer> al =
Arrays.asList(3, 5, 3, 8, 6, 1, 3, 9); boolean flag = true; for(int i : al){ if(i >= 10){ flag = false; } } List<Integer> al = Arrays.asList(3, 5, 3, 8, 6, 1, 3, 9); boolean flag = al.stream() .allMatch(i -> i < 10);
30.
リダクション:グループ化 List<String> strs =
Arrays.asList("hello", "paul", "heaven", "tatsuro"); Map<String, List<String>> result = new HashMap<>(); for(String s : strs){ String head = s.substring(0, 1); List<String> list = result.get(head); if(list == null){ list = new ArrayList<>(); result.put(head, list); } list.add(s); } for(Map.Entry<String, List<String>> me : result.entrySet()){ System.out.println(me.getKey() + ":" + me.getValue()); } List<String> strs = Arrays.asList("hello", "paul", "heaven", "tatsuro"); Map<String, List<String>> result = strs.stream() .collect(Collectors.groupingBy(s -> s.substring(0, 1))); result.forEach((k, v) -> System.out.println(k + ": " + v));
31.
リダクション:reduce ● 例:合計 – (((0 + a1)
+ a2) + a3) – .sum() ⇒.reduce(0, (s, e) -> s + e) – .count() ⇒.map(e -> 1).sum()
32.
リダクション:reduce ● reduce(単位元, (s, e)
-> s * e) – – ● s * e:結合則のある2項演算 結合則:(s1 * s2) * s3=s1 * (s2 * s3) 単位元:zを単位元とすると、 s*z=z*s=s 例: – a + b[単位元0] – a × b[単位元1] – a and b[単位元 true] – list.add(b)[単位元 new ArrayList()]
33.
リダクション(畳み込み)で何が変わるか ● ● ● 中間状態の隠蔽 中間状態の管理が不要になる 畳み込み操作でのバグは中間状態の操作ミスが 多かった
34.
並列処理 ● stream()の代わりにparallelStream()にするだけ – もしくはparallel()の呼び出し 3 5 3 38 8 8 6 38 11 1 3 38 7 9 12 38 19 38 19 38 int s =
IntStream.of(3, 5, 3, 8, 6, 1, 3, 9) .parallel() .sum();
35.
遅延実行 ● ● ● Javaは即時評価の言語 メソッド内で使われない値でも引数に渡すときに計 算が必要だった ほとんどの場合に表示されないログやエラーでの メッセージ生成が無駄 logger.info(objWithManyFields.toString()); Objects.requireNonNull(objWithManyFields.getHoge(), objWithManyFields.toString());
36.
遅延実行 ● ● ラムダ式を渡すことで、必要なときに式を評価 LoggerやObjects.requireNonNullは対応 logger.info(() -> objWithManyFields.toString()); Objects.requireNonNull(objWithManyFields.getHoge(), ()
-> objWithManyFields.toString());
37.
遅延実行:Stream Pipeline ● Streamの中間操作は、終端操作のときに実行され る
38.
無限ストリーム
39.
無限ストリーム(リスト) ● Hondaストリームの無限チューンではありません ● 終端の決まらないストリーム 初期値 次の値を求める処理 IntStream.iterate(0, i ->
i + 1) .limit(10) .forEach(System.out::println); IntStream.iterate(321, i -> (i * 211 + 2111) % 1999) .limit(10) .forEach(System.out::println);
40.
メモ化 ● ● 実行結果キャッシュ ex:再帰フィボナッチ public static void
main(String... args){ LongStream.iterate(1, i -> i + 1) .map(i -> fib(i)) .forEach(System.out::println); } public static long fib(long x){ if(x <= 2) return 1; return fib(x - 1) + fib(x - 2); }
41.
メモ化:再帰フィボナッチ ● 1回ごとに2回の呼び出し – ● O(2^n) なかなか進まない! run: 1 1 2 3 5 8 13 ・ ・ ・ 1836311903 2971215073 4807526976←このあたりで止まる
42.
メモ化:メモ化再帰フィボナッチ ● ● ● 同じパラメータで何度も呼び出される 結果キャッシュ⇒メモ化! computeIfAbsentが便利 static Map<Long, Long>
cache = new HashMap<>(); public static long fib(long i){ return cache.computeIfAbsent(i, x -> { if(x <= 2) return 1L; return fib(x - 1) + fib(x - 2); }); } あっという間にlongも桁あふれ -415292901391291839 -7413871255405604094 -7829164156796895933 3203708661507051589 -4625455495289844344
43.
null排除 ● みんな大好きNullPointerException! static String foo(int
x){ return x > 0 && x < 10 ? IntStream.range(0, x) .mapToObj(c -> (char)('a' + c) + "") .collect(Collectors.joining()) : null; } static String bar(String s){ return s.chars().max().orElse(0) % 2 == 0 ? null : s; } public static void main(String... args){ for(int i = 0; i < 20; ++i){ String s = bar(foo(i)).toUpperCase(); System.out.println(s); } } nullを返す可能性 nullを返す可能性 NullPointerException の可能性
44.
null排除:確実なnullチェックは面倒 for(int i =
0; i < 20; ++i){ String s = bar(foo(i)).toUpperCase(); System.out.println(s); } IntStream.range(0, 20) .mapToObj(MyClass::foo) .map(MyClass::bar) .map(String::toUpperCase) .forEach(System.out::println); 要nullチェック 呼び出しの分 解も必要 Streamでも要 nullチェック for(int i = 0; i < 20; ++i){ String s = foo(i); if(s == null) continue; String s2 = bar(s); if(s2 == null) continue; String up = s2.toUpperCase(); System.out.println(up); } IntStream.range(0, 20) .mapToObj(MyClass::foo) .filter(Objects::nonNull) .map(MyClass::bar) .filter(Objects::nonNull) .map(String::toUpperCase) .forEach(System.out::println);
45.
null排除:Optional ● ● 型としてnullの可能性を示せる nullへの対処が 書きやすい Optionalが返る 一度Optionalにくるまれると nullが返っても気にならない static Optional<String> foo(int
x){ return x > 0 && x < 10 ? Optional.of(IntStream.range(0, x) .mapToObj(c -> (char)('a' + c) + "") .collect(Collectors.joining())) : Optional.empty(); } static String bar(String s){ return s.chars().max().orElse(0) % 2 == 0 ? null : s; } public static void main(String... args){ for(int i = 0; i < 20; ++i){ foo(i) .map(MyClass::bar) .map(String::toUpperCase) .ifPresent(System.out::println); } }
46.
null排除:Optional#flatMap static Optional<String> foo(int
x){ return x > 0 && x < 10 ? Optional.of(IntStream.range(0, x) .mapToObj(c -> (char)('a' + c) + "") .collect(Collectors.joining())) : Optional.empty(); } static Optional<String> bar(String s){ return s.chars().max().orElse(0) % 2 == 0 ? Optional.empty() : Optional.of(s); } public static void main(String... args){ for(int i = 0; i < 20; ++i){ foo(i) .flatMap(MyClass::bar) .map(String::toUpperCase) .ifPresent(System.out::println); } } Optionalが返るものを はさむならflagMap
47.
null排除:Streamだとちょっと面倒かも IntStream.range(0, 20) .mapToObj(MyClass::foo) .forEach(op ->
{ op.flatMap(MyClass::bar) .map(String::toUpperCase) .ifPresent(System.out::println); });
48.
null排除:完璧ではない ● Optional自体がnullだとNullPointerException static Optional<String> foo(int
x){ return x > 0 && x < 10 ? Optional.of(IntStream.range(0, x) .mapToObj(c -> (char)('a' + c) + "") .collect(Collectors.joining())) : null; } static Optional<String> bar(String s){ return s.chars().max().orElse(0) % 2 == 0 ? null : Optional.of(s); } public static void main(String... args){ for(int i = 0; i < 20; ++i){ foo(i) .flatMap(MyClass::bar) .map(String::toUpperCase) .ifPresent(System.out::println); } } nullを返してしまっている NullPointerException!
Download