Submit Search
Upload
from old java to java8 - KanJava Edition
•
12 likes
•
2,875 views
心 谷本
Follow
from old Java to modern Java : reloaded for Kansai Java Engineers' Group
Read less
Read more
Software
Report
Share
Report
Share
1 of 91
Download now
Download to read offline
Recommended
Java SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイル
なおき きしだ
60分で体験する Stream / Lambda ハンズオン
60分で体験する Stream / Lambda ハンズオン
Hiroto Yamakawa
社内Java8勉強会 ラムダ式とストリームAPI
社内Java8勉強会 ラムダ式とストリームAPI
Akihiro Ikezoe
徹底解説!Project Lambdaのすべて リターンズ[祝Java8Launch #jjug]
徹底解説!Project Lambdaのすべて リターンズ[祝Java8Launch #jjug]
bitter_fox
アプリを成長させるためのログ取りとログ解析に必要なこと
アプリを成長させるためのログ取りとログ解析に必要なこと
Takao Sumitomo
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
Koichi Tanaka
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
Masatoshi Tada
数学プログラムを Haskell で書くべき 6 の理由
数学プログラムを Haskell で書くべき 6 の理由
Hiromi Ishii
Recommended
Java SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイル
なおき きしだ
60分で体験する Stream / Lambda ハンズオン
60分で体験する Stream / Lambda ハンズオン
Hiroto Yamakawa
社内Java8勉強会 ラムダ式とストリームAPI
社内Java8勉強会 ラムダ式とストリームAPI
Akihiro Ikezoe
徹底解説!Project Lambdaのすべて リターンズ[祝Java8Launch #jjug]
徹底解説!Project Lambdaのすべて リターンズ[祝Java8Launch #jjug]
bitter_fox
アプリを成長させるためのログ取りとログ解析に必要なこと
アプリを成長させるためのログ取りとログ解析に必要なこと
Takao Sumitomo
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
Koichi Tanaka
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
Masatoshi Tada
数学プログラムを Haskell で書くべき 6 の理由
数学プログラムを Haskell で書くべき 6 の理由
Hiromi Ishii
並行処理初心者のためのAkka入門
並行処理初心者のためのAkka入門
Yoshimura Soichiro
XPagesDay2015 - 誰も教えてくれなかったデバッグ方法
XPagesDay2015 - 誰も教えてくれなかったデバッグ方法
Mitsuru Katoh
Java仮想マシンの実装技術
Java仮想マシンの実装技術
Kiyokuni Kawachiya
頑張りすぎないScala
頑張りすぎないScala
takezoe
関数プログラミング入門
関数プログラミング入門
Hideyuki Tanaka
マジックビーンズ
マジックビーンズ
Akira Suenami
Javaバイトコード入門
Javaバイトコード入門
Kota Mizushima
これから Haskell を書くにあたって
これから Haskell を書くにあたって
Tsuyoshi Matsudate
Java8勉強会
Java8勉強会
賢太郎 前多
Elmで始めるFunctional Reactive Programming
Elmで始めるFunctional Reactive Programming
Yasuyuki Maeda
Rpn and forth 超入門
Rpn and forth 超入門
Yoshitaka Seo
JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」
JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」
y torazuka
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol Buffers
Seiya Mizuno
Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術
Naoki Aoyama
オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
大規模負荷テストの負荷かけ手法とトラブルシュート 〜JMeterとうまく付き合う方法〜
大規模負荷テストの負荷かけ手法とトラブルシュート 〜JMeterとうまく付き合う方法〜
infinite_loop
正規表現リテラルは本当に必要なのか?
正規表現リテラルは本当に必要なのか?
kwatch
LINE LIVE のチャットが 30,000+/min のコメント投稿を捌くようになるまで
LINE LIVE のチャットが 30,000+/min のコメント投稿を捌くようになるまで
LINE Corporation
Customized Regression Model for Airbnb Dynamic Pricing
Customized Regression Model for Airbnb Dynamic Pricing
harmonylab
高位合成におけるC++テンプレートメタプログラミングの効果
高位合成におけるC++テンプレートメタプログラミングの効果
Kenichiro MITSUDA
徹底解説!Project Lambdaのすべて in Fukuoka #j8fk
徹底解説!Project Lambdaのすべて in Fukuoka #j8fk
bitter_fox
What's new in Java 8
What's new in Java 8
jclingan
More Related Content
What's hot
並行処理初心者のためのAkka入門
並行処理初心者のためのAkka入門
Yoshimura Soichiro
XPagesDay2015 - 誰も教えてくれなかったデバッグ方法
XPagesDay2015 - 誰も教えてくれなかったデバッグ方法
Mitsuru Katoh
Java仮想マシンの実装技術
Java仮想マシンの実装技術
Kiyokuni Kawachiya
頑張りすぎないScala
頑張りすぎないScala
takezoe
関数プログラミング入門
関数プログラミング入門
Hideyuki Tanaka
マジックビーンズ
マジックビーンズ
Akira Suenami
Javaバイトコード入門
Javaバイトコード入門
Kota Mizushima
これから Haskell を書くにあたって
これから Haskell を書くにあたって
Tsuyoshi Matsudate
Java8勉強会
Java8勉強会
賢太郎 前多
Elmで始めるFunctional Reactive Programming
Elmで始めるFunctional Reactive Programming
Yasuyuki Maeda
Rpn and forth 超入門
Rpn and forth 超入門
Yoshitaka Seo
JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」
JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」
y torazuka
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol Buffers
Seiya Mizuno
Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術
Naoki Aoyama
オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
大規模負荷テストの負荷かけ手法とトラブルシュート 〜JMeterとうまく付き合う方法〜
大規模負荷テストの負荷かけ手法とトラブルシュート 〜JMeterとうまく付き合う方法〜
infinite_loop
正規表現リテラルは本当に必要なのか?
正規表現リテラルは本当に必要なのか?
kwatch
LINE LIVE のチャットが 30,000+/min のコメント投稿を捌くようになるまで
LINE LIVE のチャットが 30,000+/min のコメント投稿を捌くようになるまで
LINE Corporation
Customized Regression Model for Airbnb Dynamic Pricing
Customized Regression Model for Airbnb Dynamic Pricing
harmonylab
高位合成におけるC++テンプレートメタプログラミングの効果
高位合成におけるC++テンプレートメタプログラミングの効果
Kenichiro MITSUDA
What's hot
(20)
並行処理初心者のためのAkka入門
並行処理初心者のためのAkka入門
XPagesDay2015 - 誰も教えてくれなかったデバッグ方法
XPagesDay2015 - 誰も教えてくれなかったデバッグ方法
Java仮想マシンの実装技術
Java仮想マシンの実装技術
頑張りすぎないScala
頑張りすぎないScala
関数プログラミング入門
関数プログラミング入門
マジックビーンズ
マジックビーンズ
Javaバイトコード入門
Javaバイトコード入門
これから Haskell を書くにあたって
これから Haskell を書くにあたって
Java8勉強会
Java8勉強会
Elmで始めるFunctional Reactive Programming
Elmで始めるFunctional Reactive Programming
Rpn and forth 超入門
Rpn and forth 超入門
JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」
JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol Buffers
Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術
オブジェクト指向できていますか?
オブジェクト指向できていますか?
大規模負荷テストの負荷かけ手法とトラブルシュート 〜JMeterとうまく付き合う方法〜
大規模負荷テストの負荷かけ手法とトラブルシュート 〜JMeterとうまく付き合う方法〜
正規表現リテラルは本当に必要なのか?
正規表現リテラルは本当に必要なのか?
LINE LIVE のチャットが 30,000+/min のコメント投稿を捌くようになるまで
LINE LIVE のチャットが 30,000+/min のコメント投稿を捌くようになるまで
Customized Regression Model for Airbnb Dynamic Pricing
Customized Regression Model for Airbnb Dynamic Pricing
高位合成におけるC++テンプレートメタプログラミングの効果
高位合成におけるC++テンプレートメタプログラミングの効果
Viewers also liked
徹底解説!Project Lambdaのすべて in Fukuoka #j8fk
徹底解説!Project Lambdaのすべて in Fukuoka #j8fk
bitter_fox
What's new in Java 8
What's new in Java 8
jclingan
whats new in java 8
whats new in java 8
Dori Waldman
TDC 2015 - Java: from old school to modern art!
TDC 2015 - Java: from old school to modern art!
Marcos Ferreira
Java 8 Features
Java 8 Features
Leninkumar Koppoju
Java 8: the good parts!
Java 8: the good parts!
Andrzej Grzesik
50 new things you can do with java 8
50 new things you can do with java 8
José Paumard
Spring4-DevLove発表資料
Spring4-DevLove発表資料
Yuichi Hasegawa
Memory Management: What You Need to Know When Moving to Java 8
Memory Management: What You Need to Know When Moving to Java 8
AppDynamics
人気番組との戦い! Javaシステムのパフォーマンスチューニング奮闘記
人気番組との戦い! Javaシステムのパフォーマンスチューニング奮闘記
心 谷本
Let's reconsider about collecting logs. Plus, visiting elastic@Moutain View!
Let's reconsider about collecting logs. Plus, visiting elastic@Moutain View!
心 谷本
今すぐ始めるCloud Foundry #hackt #hackt_k
今すぐ始めるCloud Foundry #hackt #hackt_k
Toshiaki Maki
Java 8, Streams & Collectors, patterns, performances and parallelization
Java 8, Streams & Collectors, patterns, performances and parallelization
José Paumard
Short Lived Tasks in Cloud Foundry #cfdtokyo
Short Lived Tasks in Cloud Foundry #cfdtokyo
Toshiaki Maki
Spring Framework ふりかえりと4.3新機能
Spring Framework ふりかえりと4.3新機能
kimulla
Implement Service Broker with Spring Boot #cf_tokyo
Implement Service Broker with Spring Boot #cf_tokyo
Toshiaki Maki
From Zero to Hero with REST and OAuth2 #jjug
From Zero to Hero with REST and OAuth2 #jjug
Toshiaki Maki
Spring Framework 4.3から5.0へ
Spring Framework 4.3から5.0へ
movmov
from old Java to modern Java
from old Java to modern Java
心 谷本
Team Support in Concourse CI 2.0 #concourse_tokyo
Team Support in Concourse CI 2.0 #concourse_tokyo
Toshiaki Maki
Viewers also liked
(20)
徹底解説!Project Lambdaのすべて in Fukuoka #j8fk
徹底解説!Project Lambdaのすべて in Fukuoka #j8fk
What's new in Java 8
What's new in Java 8
whats new in java 8
whats new in java 8
TDC 2015 - Java: from old school to modern art!
TDC 2015 - Java: from old school to modern art!
Java 8 Features
Java 8 Features
Java 8: the good parts!
Java 8: the good parts!
50 new things you can do with java 8
50 new things you can do with java 8
Spring4-DevLove発表資料
Spring4-DevLove発表資料
Memory Management: What You Need to Know When Moving to Java 8
Memory Management: What You Need to Know When Moving to Java 8
人気番組との戦い! Javaシステムのパフォーマンスチューニング奮闘記
人気番組との戦い! Javaシステムのパフォーマンスチューニング奮闘記
Let's reconsider about collecting logs. Plus, visiting elastic@Moutain View!
Let's reconsider about collecting logs. Plus, visiting elastic@Moutain View!
今すぐ始めるCloud Foundry #hackt #hackt_k
今すぐ始めるCloud Foundry #hackt #hackt_k
Java 8, Streams & Collectors, patterns, performances and parallelization
Java 8, Streams & Collectors, patterns, performances and parallelization
Short Lived Tasks in Cloud Foundry #cfdtokyo
Short Lived Tasks in Cloud Foundry #cfdtokyo
Spring Framework ふりかえりと4.3新機能
Spring Framework ふりかえりと4.3新機能
Implement Service Broker with Spring Boot #cf_tokyo
Implement Service Broker with Spring Boot #cf_tokyo
From Zero to Hero with REST and OAuth2 #jjug
From Zero to Hero with REST and OAuth2 #jjug
Spring Framework 4.3から5.0へ
Spring Framework 4.3から5.0へ
from old Java to modern Java
from old Java to modern Java
Team Support in Concourse CI 2.0 #concourse_tokyo
Team Support in Concourse CI 2.0 #concourse_tokyo
Similar to from old java to java8 - KanJava Edition
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
JustSystems Corporation
Java x Groovy: improve your java development life
Java x Groovy: improve your java development life
Uehara Junji
Pattern match with case class
Pattern match with case class
Kai Sasaki
Java8から17へ
Java8から17へ
onozaty
ゆるふわJava8入門
ゆるふわJava8入門
dcubeio
Project lambda
Project lambda
Appresso Engineering Team
JavaDayTokyo2015 [3-1]
JavaDayTokyo2015 [3-1]
Kenji Kazumura
JavaのGenericsとは?
JavaのGenericsとは?
Kenji Nakamura
Scala東北紹介
Scala東北紹介
Takeda Hiroyuki
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
yoshiaki iwanaga
速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-
Kazunari Hara
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義
JPCERT Coordination Center
イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情
takezoe
Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016
Yoshio Terada
React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門
spring_raining
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 Autumn
Koji Ishimoto
Scala勉強会 初心者向けハンズオン前編
Scala勉強会 初心者向けハンズオン前編
takeuchi-tk
Scala EE 7 Essentials
Scala EE 7 Essentials
tnoda
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Uehara Junji
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
Ransui Iso
Similar to from old java to java8 - KanJava Edition
(20)
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Java x Groovy: improve your java development life
Java x Groovy: improve your java development life
Pattern match with case class
Pattern match with case class
Java8から17へ
Java8から17へ
ゆるふわJava8入門
ゆるふわJava8入門
Project lambda
Project lambda
JavaDayTokyo2015 [3-1]
JavaDayTokyo2015 [3-1]
JavaのGenericsとは?
JavaのGenericsとは?
Scala東北紹介
Scala東北紹介
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義
イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情
Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016
React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 Autumn
Scala勉強会 初心者向けハンズオン前編
Scala勉強会 初心者向けハンズオン前編
Scala EE 7 Essentials
Scala EE 7 Essentials
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
More from 心 谷本
JJUG CCC 2015 Fall keynote
JJUG CCC 2015 Fall keynote
心 谷本
Spring Bootをはじめる時にやるべき10のこと
Spring Bootをはじめる時にやるべき10のこと
心 谷本
Spring Boot + Netflix Eureka
Spring Boot + Netflix Eureka
心 谷本
プレゼンの技術 2 実践編
プレゼンの技術 2 実践編
心 谷本
プレゼンの技術 1 考え方
プレゼンの技術 1 考え方
心 谷本
プレゼンの技術
プレゼンの技術
心 谷本
実例Javaトラブルシューティング! 〜稼働中のシステムを立て直した半年間の軌跡
実例Javaトラブルシューティング! 〜稼働中のシステムを立て直した半年間の軌跡
心 谷本
日本一細かいJavaOne2011報告
日本一細かいJavaOne2011報告
心 谷本
勝敗は常に見積もりで決まる〜Redmineを使った時間記録の話
勝敗は常に見積もりで決まる〜Redmineを使った時間記録の話
心 谷本
日本で二番目に「細かい」JavaOne2011報告
日本で二番目に「細かい」JavaOne2011報告
心 谷本
[関ジャバ]Java News 2011 Mar
[関ジャバ]Java News 2011 Mar
心 谷本
More from 心 谷本
(11)
JJUG CCC 2015 Fall keynote
JJUG CCC 2015 Fall keynote
Spring Bootをはじめる時にやるべき10のこと
Spring Bootをはじめる時にやるべき10のこと
Spring Boot + Netflix Eureka
Spring Boot + Netflix Eureka
プレゼンの技術 2 実践編
プレゼンの技術 2 実践編
プレゼンの技術 1 考え方
プレゼンの技術 1 考え方
プレゼンの技術
プレゼンの技術
実例Javaトラブルシューティング! 〜稼働中のシステムを立て直した半年間の軌跡
実例Javaトラブルシューティング! 〜稼働中のシステムを立て直した半年間の軌跡
日本一細かいJavaOne2011報告
日本一細かいJavaOne2011報告
勝敗は常に見積もりで決まる〜Redmineを使った時間記録の話
勝敗は常に見積もりで決まる〜Redmineを使った時間記録の話
日本で二番目に「細かい」JavaOne2011報告
日本で二番目に「細かい」JavaOne2011報告
[関ジャバ]Java News 2011 Mar
[関ジャバ]Java News 2011 Mar
from old java to java8 - KanJava Edition
1.
from old Java to
modern Java ∼ レビューで学ぶJava8時代のコーディング作法 Acroquest Technology株式会社 JJUG / 関西Javaエンジニアの会 谷本 心 ( @cero_t )
2.
自己紹介 • 名前 :
谷本 心 (たにもと しん) • 職業 : Javaエンジニア / トラブルシューター トラブルシュート教育も引き受けます! • Twitter : @cero_t • その他 : 日本Javaユーザ会(JJUG) 幹事 関西Javaエンジニアの会 主催
3.
さて、 Java8が出ましたが
4.
今日は 関ジャバ∞ と考えて 差し支えないですか?
5.
バ
6.
7.
8.
自己紹介 • 名前 :
谷本 心 (たにもと しん) • 職業 : Javaエンジニア / トラブルシューター トラブルシュート教育も引き受けます! • Twitter : @cero_t • その他 : 日本Javaユーザ会(JJUG) 幹事 関西Javaエンジニアの会 主催
9.
さて、 Java8が出ましたが
10.
「どうせ、使うのはまだ先」 とか思ってませんか?
11.
きっと、ずっと先でしょう。
12.
でも、たとえば今
13.
Java6やJava7の勉強を きちんとできますか?
14.
出始めこそ、 たくさん情報が出てくる
15.
じゃ、いつやるか?
16.
やらせねーよ (我が家)
17.
from old Java to
modern Java ∼ レビューで学ぶJava8時代のコーディング作法 Acroquest Technology株式会社 JJUG / 関西Javaエンジニアの会 谷本 心 ( @cero_t )
18.
ソースコードレビュー してますか?
19.
レビューを する方が多いですか? 受ける方が多いですか?
20.
もちろん レビューする方が 多いですね
21.
若いんで(?) レビューを受ける方が 多いです
22.
レビューなんて文化 ありません
23.
履歴書の送付先 : tanimoto.shin@gmail.com
24.
では早速、コード。
25.
Map<Dept, Long> groupByDeptAndFilter(List<Emp>
list) { return list.stream() .collect(Collectors.groupingBy(emp -> emp.dept)) .entrySet() .stream() .collect(Collectors.toMap(entry -> entry.getKey(), entry -> entry.getValue() .stream() .filter(emp -> emp.sal > 1000) .count())); }
26.
何これ読めない
27.
「よく分からないし for文とmapで 書き直してくれる?」
28.
Map<Dept, Long> groupByDeptClassic(List<Emp>
list) { Map<Dept, Long> result = new HashMap<>(); for (Emp emp : list) { if (result.containsKey(emp.dept) == false) { result.put(emp.dept, 0L); } if (emp.sal > 1000) { Long count = result.get(emp.dept); count++; result.put(emp.dept, count); } } return result; }
29.
「あー、読みやすくて 安心するー」
30.
Welcome to 老 害
世 代
31.
from old Java to
modern Java ∼ 老害にならないためのJava8入門 Acroquest Technology株式会社 JJUG / 関西Javaエンジニアの会 谷本 心 ( @cero_t )
32.
Lesson1 今の時代のファイル操作を 理解せよ!
33.
おさらい: finallyでcloseするという定石
34.
List<String> readFileSE6(String fileName)
{ List<String> lines = new ArrayList<String>(); BufferedReader reader = null; try { reader = new BufferedReader(new FileReader(fileName)); String line; while ((line = reader.readLine()) != null) { lines.add("<" + line + ">"); } reader.close(); } catch (IOException ex) { throw new RuntimeException(ex); } return lines; } これあかん やつや!
35.
List<String> readFileSE6(String fileName)
{ List<String> lines = new ArrayList<String>(); BufferedReader reader = null; try { reader = new BufferedReader(new FileReader(fileName)); String line; while ((line = reader.readLine()) != null) { lines.add("<" + line + ">"); } } catch (IOException ex) { throw new RuntimeException(ex); // 例外処理は割愛 } finally { try { if (reader != null) { reader.close(); } } catch (IOException ex) { // この例外は無視する? } } return lines; } やっぱfinallyで closeですよね!
36.
finallyでcloseするのは 古い定石 (∼Java6)
37.
try-with-resourcesで イマドキのJavaに! (Java7∼)
38.
List<String> readFileSE7_1(String fileName)
{ List<String> lines = new ArrayList<>(); try (FileReader in = new FileReader(fileName); BufferedReader reader = new BufferedReader(in)) { String line; while ((line = reader.readLine()) != null) { lines.add("<" + line + ">"); } } catch (IOException ex) { throw new RuntimeException(ex); } return lines; } これが try-with-resources!
39.
でも! 変なところがあるんです。
40.
List<String> readFileSE7_1(String fileName)
{ List<String> lines = new ArrayList<>(); try (FileReader in = new FileReader(fileName); BufferedReader reader = new BufferedReader(in)) { String line; while ((line = reader.readLine()) != null) { lines.add("<" + line + ">"); } } catch (IOException ex) { throw new RuntimeException(ex); } return lines; } !?
41.
List<String> readFileSE7_2(String fileName)
{ List<String> lines = new ArrayList<>(); Path path = Paths.get(fileName); try (BufferedReader reader = Files.newBufferedReader(path)) { String line; while ((line = reader.readLine()) != null) { lines.add("<" + line + ">"); } } catch (IOException ex) { throw new RuntimeException(ex); } return lines; }
42.
新定石①: try-with-resourcesと FilesとPathで操作する (Java7∼)
43.
新定石②: ファイルを一気に読むなら Files.readAllLines! (Java7∼)
44.
List<String> readFileSE7_3(String fileName)
{ try { List<String> lines = Files.readAllLines(Paths.get(fileName)); for (int i = 0; i < lines.size(); i++) { lines.set(i, "<" + lines.get(i) + ">"); } return lines; } catch (IOException ex) { throw new RuntimeException(ex); } } 一気に読み込むのは便利だけど、 ヒープメモリもたくさん使っちゃう し、それぞれの行に対する処理が 必要な場合は、どうしてもループを 回し直さなきゃいけないよね。
45.
Java8時代は?
46.
List<String> readFileSE8_1(String fileName)
{ List<String> lines = new ArrayList<>(); try { Files.lines(Paths.get(fileName)) .forEach(s -> lines.add("<" + s + ">")); } catch (IOException ex) { throw new UncheckedIOException(ex); } return lines; }
47.
新定石③?: Files.linesで処理をする (Java8∼)
48.
新定石③: forやwhileを見たら Stream APIへの 置き換えを考える
49.
List<String> readFileSE8_1(String fileName)
{ try { return Files.lines(Paths.get(fileName)) .map(s -> "<" + s + ">") .collect(Collectors.toList()); } catch (IOException ex) { throw new UncheckedIOException(ex); } } 外部のオブジェクトを 操作しない方が安心。
50.
ちょっとクイズ
51.
void writeSE8_1(String fileName,
List<String> lines) { Path path = Paths.get(fileName); try (BufferedWriter writer = Files.newBufferedWriter(path)) { lines.forEach(s -> writer.write("<" + s + ">")); } catch (IOException e) { throw new UncheckedIOException(ex); } }
52.
void writeSE8_1(String fileName,
List<String> lines) { Path path = Paths.get(fileName); try (BufferedWriter writer = Files.newBufferedWriter(path)) { lines.forEach(s -> writer.write("<" + s + ">")); } catch (IOException e) { throw new UncheckedIOException(ex); } } 1. ちゃんと出力されるんじゃない? 2. 順番がグチャグチャになりそうだな・・・ 3. コンパイルエラーが起きるよ、これ 4. 実行時例外が起きるよ、これ
53.
void writeSE8_1(String fileName,
List<String> lines) { Path path = Paths.get(fileName); try (BufferedWriter writer = Files.newBufferedWriter(path)) { lines.forEach(s -> writer.write("<" + s + ">")); } catch (IOException e) { throw new UncheckedIOException(ex); } } 1. ちゃんと出力されるんじゃない? 2. 順番がグチャグチャになりそうだな・・・ 3. コンパイルエラーが起きるよ、これ 4. 実行時例外が起きるよ、これ
54.
void writeSE8_2(String fileName,
List<String> lines) { Path path = Paths.get(fileName); try (BufferedWriter writer = Files.newBufferedWriter(path)) { lines.forEach(s -> { try { writer.write(s); } catch (IOException ex) { throw new UncheckedIOException(ex); } }); } catch (IOException ex) { throw new UncheckedIOException(ex); } }
55.
なんでもかんでも Lambdaにすれば 良いってもんでもない
56.
Lesson2 文字列操作は どう変わる?
57.
String joinSE7(List<String> lines)
{ StringBuilder builder = new StringBuilder(); for (int i = 0; i < lines.size(); i++) { if (i > 0) { builder.append(","); } builder.append(lines.get(i)); } return builder.toString(); } String joinCommons(List<String> lines) { return StringUtils.join(lines, ","); } String joinGuava(List<String> lines) { return Joiner.on(",").join(lines); } みんな大好き 文字列結合 Commons Langとか Guavaとか使うよねー
58.
String joinSE8(List<String> lines)
{ return String.join(",", lines); } ようやく搭載された String#join
59.
新定石④: String.joinさん こんにちは! (Java8∼)
60.
String joinPrefixSE7(List<String> lines)
{ StringBuilder builder = new StringBuilder(); for (int i = 0; i < lines.size(); i++) { if (i > 0) { builder.append(","); } builder.append(“<") .append(lines.get(i)) .append(">"); } return builder.toString(); } じゃ、こういうパター ンはどうするの?
61.
private String joinPrefixCommons(List<String>
lines) { return "<" + StringUtils.join(lines, ">,<") + ">"; } private String joinPrefixGuava(List<String> lines) { return "<" + Joiner.on(">,<").join(lines) + ">"; }
62.
助けてJava8マン!
63.
private String joinPrefixSE8(List<String>
lines) { return lines.stream() .map(s -> "<" + s +”>") .collect(Collectors.joining(",")); } 要するに StreamAPIが正義
64.
新定石⑤: String.joinさん さようなら! (Java8∼)
65.
結局、新定石③: forやwhileを見たら Stream APIへの 置き換えを考える
66.
Lesson3 forやwhileとifとか いろいろ行なう集計的なアレ
67.
Map<Dept, Long> groupByDeptAndFilterClassic(List<Emp>
list) { Map<Dept, Long> result = new HashMap<>(); for (Emp emp : list) { if (result.containsKey(emp.dept) == false) { result.put(emp.dept, 0L); } if (emp.sal > 1000) { Long count = result.get(emp.dept) + 1; result.put(emp.dept, count); } } return result; } 給料が1000ドルを超える社員 の数を部署ごとに集計する
68.
Java8時代は、 最初、こうなると思う
69.
Map<Dept, Long> groupByDeptAndFilterClassic(List<Emp>
list) { Map<Dept, Long> result = new HashMap<>(); for (Emp emp : list) { result.putIfAbsent(emp.dept, 0L); if (emp.sal > 1000) { Long count = result.get(emp.dept) + 1; result.put(emp.dept, count); } } return result; } 新しい便利API
70.
でも、新定石③: forやwhileを見たら Stream APIへの 置き換えを考える
71.
Map<Dept, Long> groupByDeptAndFilterLambda(List<Emp>
list) { return list.stream() .collect(Collectors.groupingBy(emp -> emp.dept)) .entrySet() .stream() .collect(Collectors.toMap(entry -> entry.getKey(), entry -> entry.getValue() .stream() .filter(emp -> emp.sal > 1000) .count())); }
72.
どうやって書くの? どうやって読むの?
73.
select DEPT_ID, COUNT(EMP_ID) from EMP where EMP.SAL >
1000 group by EMP.DEPT_ID
74.
SQLと一緒。 勉強して、書いて、 書いて、書いて、 そして、書く。
75.
input : List<Emp> output
: Map<Dept, Empの数> ただしEmpは給与が1000より大きい 1. いったん List<Emp> を Map<Dept, List<Emp>> にグルーピングする。 2. Mapの値であるList<Emp>を1000でフィルタリングする。 3. フィルタリング後のList<Emp>をカウントする。
76.
Map<Dept, Long> groupByDeptAndFilterLambda2(List<Emp>
list) { Map<Dept, List<Emp>> groupByDept = list.stream() .collect(Collectors.groupingBy(emp -> emp.dept)); Map<Dept, List<? super Emp>> filtered = groupByDept.entrySet() .stream() .collect(Collectors.toMap(entry -> entry.getKey(), entry -> entry.getValue() .stream() .filter(emp -> emp.sal > 1000) .collect(Collectors.toList()))); Map<Dept, Long> counted = filtered.entrySet() .stream() .collect(Collectors.toMap(entry -> entry.getKey(), entry -> entry.getValue() .stream() .count())); return counted; }
77.
Map<Dept, Long> groupByDeptAndFilterLambda(List<Emp>
list) { return list.stream() .collect(Collectors.groupingBy(emp -> emp.dept)) .entrySet() .stream() .collect(Collectors.toMap(entry -> entry.getKey(), entry -> entry.getValue() .stream() .filter(emp -> emp.sal > 1000) .count())); }
78.
正直、ちょっとAPIが 足りない感じなので 自分で追加すると良い (この辺は熟成待ち?) http://blog.exoego.net/2013/12/control-collector-to-rule-stream-api.html Collectorを征す者はStream APIを征す(部分的に) -
I am programmer and proud
79.
検索: ラムダ禁止
80.
まとめ
81.
forとwhileを見たら Lambda化を考えよう
82.
レビューで forとwhileを見つけたら Lambda化させよう
83.
レビューで 100行ぐらいの Lambdaが出てきたら
84.
…
85.
自分たちの標準として どうすれば読みやすくするか チームで考えよう!
86.
from old Java to
modern Java ∼ 老害にならないためのJava8入門 Acroquest Technology株式会社 JJUG / 関西Javaエンジニアの会 谷本 心 ( @cero_t )
87.
あ、そうそう
88.
from old Java to
modern Java がきっかけで
89.
Java本格入門(仮) 鋭意執筆中!
90.
頑張ります m(_ _)m
91.
Let s Study
Java8!
Download now