SlideShare ist ein Scribd-Unternehmen logo
1 von 91
Downloaden Sie, um offline zu lesen
from old Java

to modern Java
∼ レビューで学ぶJava8時代のコーディング作法
Acroquest Technology株式会社

JJUG / 関西Javaエンジニアの会
谷本 心 ( @cero_t )
自己紹介
• 名前 : 谷本 心 (たにもと しん)
• 職業 : Javaエンジニア / トラブルシューター

   トラブルシュート教育も引き受けます!
• Twitter : @cero_t
• その他 : 日本Javaユーザ会(JJUG) 幹事

    関西Javaエンジニアの会 主催
さて、

Java8が出ましたが
今日は

関ジャバ∞

と考えて

差し支えないですか?
バ
自己紹介
• 名前 : 谷本 心 (たにもと しん)
• 職業 : Javaエンジニア / トラブルシューター

   トラブルシュート教育も引き受けます!
• Twitter : @cero_t
• その他 : 日本Javaユーザ会(JJUG) 幹事

    関西Javaエンジニアの会 主催
さて、

Java8が出ましたが
「どうせ、使うのはまだ先」

とか思ってませんか?
きっと、ずっと先でしょう。
でも、たとえば今
Java6やJava7の勉強を

きちんとできますか?
出始めこそ、

たくさん情報が出てくる
じゃ、いつやるか?
やらせねーよ
(我が家)
from old Java

to modern Java
∼ レビューで学ぶJava8時代のコーディング作法
Acroquest Technology株式会社

JJUG / 関西Javaエンジニアの会
谷本 心 ( @cero_t )
ソースコードレビュー

してますか?
レビューを

する方が多いですか?

受ける方が多いですか?
もちろん

レビューする方が

多いですね
若いんで(?)

レビューを受ける方が

多いです
レビューなんて文化

ありません
履歴書の送付先 :

tanimoto.shin@gmail.com
では早速、コード。
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()));
}
何これ読めない
「よく分からないし

for文とmapで

書き直してくれる?」
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;
}
「あー、読みやすくて

安心するー」
Welcome to

老 害 世 代
from old Java

to modern Java
∼ 老害にならないためのJava8入門
Acroquest Technology株式会社

JJUG / 関西Javaエンジニアの会
谷本 心 ( @cero_t )
Lesson1
今の時代のファイル操作を

理解せよ!
おさらい:
finallyでcloseするという定石
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;
}
これあかん
やつや!
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ですよね!
finallyでcloseするのは

古い定石

(∼Java6)
try-with-resourcesで

イマドキのJavaに!

(Java7∼)
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!
でも!
変なところがあるんです。
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;
}
!?
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;
}
新定石①:
try-with-resourcesと

FilesとPathで操作する

(Java7∼)
新定石②:

ファイルを一気に読むなら

Files.readAllLines!

(Java7∼)
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);
}
}
一気に読み込むのは便利だけど、
ヒープメモリもたくさん使っちゃう
し、それぞれの行に対する処理が
必要な場合は、どうしてもループを
回し直さなきゃいけないよね。
Java8時代は?
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;

}
新定石③?:
Files.linesで処理をする

(Java8∼)
新定石③:
forやwhileを見たら

Stream APIへの

置き換えを考える
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);
}
}
外部のオブジェクトを

操作しない方が安心。
ちょっとクイズ
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);
}
}
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. 実行時例外が起きるよ、これ
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. 実行時例外が起きるよ、これ
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);
}
}
なんでもかんでも

Lambdaにすれば

良いってもんでもない
Lesson2

文字列操作は

どう変わる?
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とか使うよねー
String joinSE8(List<String> lines) {
return String.join(",", lines);
}
ようやく搭載された

String#join
新定石④:
String.joinさん

こんにちは!

(Java8∼)
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();
}
じゃ、こういうパター
ンはどうするの?
private String joinPrefixCommons(List<String> lines) {
return "<" + StringUtils.join(lines, ">,<") + ">";
}
private String joinPrefixGuava(List<String> lines) {
return "<" + Joiner.on(">,<").join(lines) + ">";
}
助けてJava8マン!
private String joinPrefixSE8(List<String> lines) {
return lines.stream()
.map(s -> "<" + s +”>")
.collect(Collectors.joining(","));
}
要するに

StreamAPIが正義
新定石⑤:
String.joinさん

さようなら!

(Java8∼)
結局、新定石③:
forやwhileを見たら

Stream APIへの

置き換えを考える
Lesson3
forやwhileとifとか

いろいろ行なう集計的なアレ
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ドルを超える社員
の数を部署ごとに集計する
Java8時代は、

最初、こうなると思う
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
でも、新定石③:
forやwhileを見たら

Stream APIへの

置き換えを考える
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()));
}
どうやって書くの?
どうやって読むの?
select
DEPT_ID, COUNT(EMP_ID)
from
EMP
where
EMP.SAL > 1000
group by
EMP.DEPT_ID
SQLと一緒。

勉強して、書いて、

書いて、書いて、

そして、書く。
input : List<Emp>
output : Map<Dept, Empの数>
    ただしEmpは給与が1000より大きい
1. いったん List<Emp> を Map<Dept, List<Emp>> にグルーピングする。
2. Mapの値であるList<Emp>を1000でフィルタリングする。
3. フィルタリング後のList<Emp>をカウントする。
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;
}
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()));
}
正直、ちょっとAPIが

足りない感じなので

自分で追加すると良い

(この辺は熟成待ち?)


http://blog.exoego.net/2013/12/control-collector-to-rule-stream-api.html

Collectorを征す者はStream APIを征す(部分的に) - I am programmer and proud
検索: ラムダ禁止
まとめ
forとwhileを見たら

Lambda化を考えよう
レビューで

forとwhileを見つけたら

Lambda化させよう
レビューで

100行ぐらいの

Lambdaが出てきたら
…
自分たちの標準として

どうすれば読みやすくするか

チームで考えよう!
from old Java

to modern Java
∼ 老害にならないためのJava8入門
Acroquest Technology株式会社

JJUG / 関西Javaエンジニアの会
谷本 心 ( @cero_t )
あ、そうそう
from old Java

to modern Java
がきっかけで
Java本格入門(仮)
鋭意執筆中!
頑張ります
m(_ _)m
Let s Study Java8!

Weitere ähnliche Inhalte

Was ist angesagt?

なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)Mikiya Okuno
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugMasatoshi Tada
 
入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き土岐 孝平
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているKoichi Tanaka
 
Spring Boot + Doma + AngularJSで作るERP #jjug_ccc #ccc_r12
Spring Boot + Doma + AngularJSで作るERP #jjug_ccc #ccc_r12Spring Boot + Doma + AngularJSで作るERP #jjug_ccc #ccc_r12
Spring Boot + Doma + AngularJSで作るERP #jjug_ccc #ccc_r12学 松崎
 
異次元のグラフデータベースNeo4j
異次元のグラフデータベースNeo4j異次元のグラフデータベースNeo4j
異次元のグラフデータベースNeo4j昌桓 李
 
データベース設計徹底指南
データベース設計徹底指南データベース設計徹底指南
データベース設計徹底指南Mikiya Okuno
 
今こそStream API入門
今こそStream API入門今こそStream API入門
今こそStream API入門Yuichi Sakuraba
 
イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)Yoshitaka Kawashima
 
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割Recruit Lifestyle Co., Ltd.
 
人生がときめくAPIテスト自動化 with Karate
人生がときめくAPIテスト自動化 with Karate人生がときめくAPIテスト自動化 with Karate
人生がときめくAPIテスト自動化 with KarateTakanori Suzuki
 
Spring超入門-Springと出会ってから1年半-
Spring超入門-Springと出会ってから1年半-Spring超入門-Springと出会ってから1年半-
Spring超入門-Springと出会ってから1年半-Ryosuke Uchitate
 
イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知るShuhei Fujita
 
Ormとの付き合い方
Ormとの付き合い方Ormとの付き合い方
Ormとの付き合い方豊明 尾古
 
Elixirと他言語の比較的紹介 ver.2
Elixirと他言語の比較的紹介ver.2Elixirと他言語の比較的紹介ver.2
Elixirと他言語の比較的紹介 ver.2Tsunenori Oohara
 
Entity Framework(Core)についての概要を学ぼう
Entity Framework(Core)についての概要を学ぼうEntity Framework(Core)についての概要を学ぼう
Entity Framework(Core)についての概要を学ぼうTomomitsuKusaba
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)Takuto Wada
 

Was ist angesagt? (20)

SpringBootTest入門
SpringBootTest入門SpringBootTest入門
SpringBootTest入門
 
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
 
入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
 
Spring Boot + Doma + AngularJSで作るERP #jjug_ccc #ccc_r12
Spring Boot + Doma + AngularJSで作るERP #jjug_ccc #ccc_r12Spring Boot + Doma + AngularJSで作るERP #jjug_ccc #ccc_r12
Spring Boot + Doma + AngularJSで作るERP #jjug_ccc #ccc_r12
 
異次元のグラフデータベースNeo4j
異次元のグラフデータベースNeo4j異次元のグラフデータベースNeo4j
異次元のグラフデータベースNeo4j
 
データベース設計徹底指南
データベース設計徹底指南データベース設計徹底指南
データベース設計徹底指南
 
今こそStream API入門
今こそStream API入門今こそStream API入門
今こそStream API入門
 
イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)
 
Mavenの真実とウソ
Mavenの真実とウソMavenの真実とウソ
Mavenの真実とウソ
 
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
 
人生がときめくAPIテスト自動化 with Karate
人生がときめくAPIテスト自動化 with Karate人生がときめくAPIテスト自動化 with Karate
人生がときめくAPIテスト自動化 with Karate
 
Spring超入門-Springと出会ってから1年半-
Spring超入門-Springと出会ってから1年半-Spring超入門-Springと出会ってから1年半-
Spring超入門-Springと出会ってから1年半-
 
イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知る
 
Ormとの付き合い方
Ormとの付き合い方Ormとの付き合い方
Ormとの付き合い方
 
Elixirと他言語の比較的紹介 ver.2
Elixirと他言語の比較的紹介ver.2Elixirと他言語の比較的紹介ver.2
Elixirと他言語の比較的紹介 ver.2
 
ServiceとRepository
ServiceとRepositoryServiceとRepository
ServiceとRepository
 
Entity Framework(Core)についての概要を学ぼう
Entity Framework(Core)についての概要を学ぼうEntity Framework(Core)についての概要を学ぼう
Entity Framework(Core)についての概要を学ぼう
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
 

Andere mochten auch

徹底解説!Project Lambdaのすべて in Fukuoka #j8fk
徹底解説!Project Lambdaのすべて in Fukuoka #j8fk徹底解説!Project Lambdaのすべて in Fukuoka #j8fk
徹底解説!Project Lambdaのすべて in Fukuoka #j8fkbitter_fox
 
What's new in Java 8
What's new in Java 8What's new in Java 8
What's new in Java 8jclingan
 
whats new in java 8
whats new in java 8 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!TDC 2015 - Java: from old school to modern art!
TDC 2015 - Java: from old school to modern art!Marcos Ferreira
 
Java SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイルJava SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイルなおき きしだ
 
50 new things you can do with java 8
50 new things you can do with java 850 new things you can do with java 8
50 new things you can do with java 8José Paumard
 
Spring4-DevLove発表資料
Spring4-DevLove発表資料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 8Memory Management: What You Need to Know When Moving to Java 8
Memory Management: What You Need to Know When Moving to Java 8AppDynamics
 
人気番組との戦い! Javaシステムのパフォーマンスチューニング奮闘記
人気番組との戦い! Javaシステムのパフォーマンスチューニング奮闘記人気番組との戦い! Javaシステムのパフォーマンスチューニング奮闘記
人気番組との戦い! Javaシステムのパフォーマンスチューニング奮闘記心 谷本
 
Let's reconsider about collecting logs. Plus, visiting elastic@Moutain View!
Let's reconsider about collecting logs. Plus, visiting elastic@Moutain View!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今すぐ始めるCloud Foundry #hackt #hackt_k
今すぐ始めるCloud Foundry #hackt #hackt_kToshiaki Maki
 
Java 8, Streams & Collectors, patterns, performances and parallelization
Java 8, Streams & Collectors, patterns, performances and parallelizationJava 8, Streams & Collectors, patterns, performances and parallelization
Java 8, Streams & Collectors, patterns, performances and parallelizationJosé Paumard
 
Short Lived Tasks in Cloud Foundry #cfdtokyo
Short Lived Tasks in Cloud Foundry #cfdtokyoShort Lived Tasks in Cloud Foundry #cfdtokyo
Short Lived Tasks in Cloud Foundry #cfdtokyoToshiaki Maki
 
Spring Framework ふりかえりと4.3新機能
Spring Framework ふりかえりと4.3新機能Spring Framework ふりかえりと4.3新機能
Spring Framework ふりかえりと4.3新機能kimulla
 
Implement Service Broker with Spring Boot #cf_tokyo
Implement Service Broker with Spring Boot #cf_tokyoImplement Service Broker with Spring Boot #cf_tokyo
Implement Service Broker with Spring Boot #cf_tokyoToshiaki Maki
 
From Zero to Hero with REST and OAuth2 #jjug
From Zero to Hero with REST and OAuth2 #jjugFrom Zero to Hero with REST and OAuth2 #jjug
From Zero to Hero with REST and OAuth2 #jjugToshiaki Maki
 
Spring Framework 4.3から5.0へ
Spring Framework 4.3から5.0へSpring Framework 4.3から5.0へ
Spring Framework 4.3から5.0へmovmov
 
from old Java to modern Java
from old Java to modern Javafrom old Java to modern Java
from old Java to modern Java心 谷本
 

Andere mochten auch (20)

徹底解説!Project Lambdaのすべて in Fukuoka #j8fk
徹底解説!Project Lambdaのすべて in Fukuoka #j8fk徹底解説!Project Lambdaのすべて in Fukuoka #j8fk
徹底解説!Project Lambdaのすべて in Fukuoka #j8fk
 
What's new in Java 8
What's new in Java 8What's new in Java 8
What's new in Java 8
 
whats new in java 8
whats 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!TDC 2015 - Java: from old school to modern art!
TDC 2015 - Java: from old school to modern art!
 
Java 8 Features
Java 8 FeaturesJava 8 Features
Java 8 Features
 
Java 8: the good parts!
Java 8: the good parts!Java 8: the good parts!
Java 8: the good parts!
 
Java SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイルJava SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイル
 
50 new things you can do with java 8
50 new things you can do with java 850 new things you can do with java 8
50 new things you can do with java 8
 
Spring4-DevLove発表資料
Spring4-DevLove発表資料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 8Memory 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システムのパフォーマンスチューニング奮闘記人気番組との戦い! Javaシステムのパフォーマンスチューニング奮闘記
人気番組との戦い! Javaシステムのパフォーマンスチューニング奮闘記
 
Let's reconsider about collecting logs. Plus, visiting elastic@Moutain View!
Let's reconsider about collecting logs. Plus, visiting elastic@Moutain View!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今すぐ始める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 parallelizationJava 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 #cfdtokyoShort Lived Tasks in Cloud Foundry #cfdtokyo
Short Lived Tasks in Cloud Foundry #cfdtokyo
 
Spring Framework ふりかえりと4.3新機能
Spring Framework ふりかえりと4.3新機能Spring Framework ふりかえりと4.3新機能
Spring Framework ふりかえりと4.3新機能
 
Implement Service Broker with Spring Boot #cf_tokyo
Implement Service Broker with Spring Boot #cf_tokyoImplement 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 #jjugFrom 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へSpring Framework 4.3から5.0へ
Spring Framework 4.3から5.0へ
 
from old Java to modern Java
from old Java to modern Javafrom old Java to modern Java
from old Java to modern Java
 

Ähnlich wie from old java to java8 - KanJava Edition

Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜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 lifeJava x Groovy: improve your java development life
Java x Groovy: improve your java development lifeUehara Junji
 
Pattern match with case class
Pattern match with case classPattern match with case class
Pattern match with case classKai Sasaki
 
Java8から17へ
Java8から17へJava8から17へ
Java8から17へonozaty
 
ゆるふわJava8入門
ゆるふわJava8入門ゆるふわJava8入門
ゆるふわJava8入門dcubeio
 
JavaDayTokyo2015 [3-1]
JavaDayTokyo2015 [3-1]JavaDayTokyo2015 [3-1]
JavaDayTokyo2015 [3-1]Kenji Kazumura
 
JavaのGenericsとは?
JavaのGenericsとは?JavaのGenericsとは?
JavaのGenericsとは?Kenji Nakamura
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」yoshiaki iwanaga
 
速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-Kazunari Hara
 
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義JPCERT Coordination Center
 
イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情takezoe
 
Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016Yoshio Terada
 
React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門spring_raining
 
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnJavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnKoji Ishimoto
 
Scala勉強会 初心者向けハンズオン前編
Scala勉強会 初心者向けハンズオン前編Scala勉強会 初心者向けハンズオン前編
Scala勉強会 初心者向けハンズオン前編takeuchi-tk
 
Scala EE 7 Essentials
Scala EE 7 EssentialsScala EE 7 Essentials
Scala EE 7 Essentialstnoda
 
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Java One 2012 Tokyo JVM Lang. BOF(Groovy)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 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Ransui Iso
 

Ähnlich wie from old java to java8 - KanJava Edition (20)

Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
 
Java x Groovy: improve your java development life
Java x Groovy: improve your java development lifeJava x Groovy: improve your java development life
Java x Groovy: improve your java development life
 
Pattern match with case class
Pattern match with case classPattern match with case class
Pattern match with case class
 
Java8から17へ
Java8から17へJava8から17へ
Java8から17へ
 
ゆるふわJava8入門
ゆるふわJava8入門ゆるふわJava8入門
ゆるふわJava8入門
 
Project lambda
Project lambdaProject lambda
Project lambda
 
JavaDayTokyo2015 [3-1]
JavaDayTokyo2015 [3-1]JavaDayTokyo2015 [3-1]
JavaDayTokyo2015 [3-1]
 
JavaのGenericsとは?
JavaのGenericsとは?JavaのGenericsとは?
JavaのGenericsとは?
 
Scala東北紹介
Scala東北紹介Scala東北紹介
Scala東北紹介
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
 
速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-
 
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義
 
イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情
 
Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016
 
React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門
 
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnJavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 Autumn
 
Scala勉強会 初心者向けハンズオン前編
Scala勉強会 初心者向けハンズオン前編Scala勉強会 初心者向けハンズオン前編
Scala勉強会 初心者向けハンズオン前編
 
Scala EE 7 Essentials
Scala EE 7 EssentialsScala EE 7 Essentials
Scala EE 7 Essentials
 
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Java One 2012 Tokyo JVM Lang. BOF(Groovy)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 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
 

Mehr von 心 谷本

JJUG CCC 2015 Fall keynote
JJUG CCC 2015 Fall keynoteJJUG CCC 2015 Fall keynote
JJUG CCC 2015 Fall keynote心 谷本
 
Spring Bootをはじめる時にやるべき10のこと
Spring Bootをはじめる時にやるべき10のことSpring Bootをはじめる時にやるべき10のこと
Spring Bootをはじめる時にやるべき10のこと心 谷本
 
Spring Boot + Netflix Eureka
Spring Boot + Netflix EurekaSpring Boot + Netflix Eureka
Spring Boot + Netflix Eureka心 谷本
 
プレゼンの技術 2 実践編
プレゼンの技術 2 実践編プレゼンの技術 2 実践編
プレゼンの技術 2 実践編心 谷本
 
プレゼンの技術 1 考え方
プレゼンの技術 1 考え方プレゼンの技術 1 考え方
プレゼンの技術 1 考え方心 谷本
 
プレゼンの技術
プレゼンの技術プレゼンの技術
プレゼンの技術心 谷本
 
実例Javaトラブルシューティング! 〜稼働中のシステムを立て直した半年間の軌跡
実例Javaトラブルシューティング! 〜稼働中のシステムを立て直した半年間の軌跡実例Javaトラブルシューティング! 〜稼働中のシステムを立て直した半年間の軌跡
実例Javaトラブルシューティング! 〜稼働中のシステムを立て直した半年間の軌跡心 谷本
 
日本一細かいJavaOne2011報告
日本一細かいJavaOne2011報告日本一細かいJavaOne2011報告
日本一細かいJavaOne2011報告心 谷本
 
勝敗は常に見積もりで決まる〜Redmineを使った時間記録の話
勝敗は常に見積もりで決まる〜Redmineを使った時間記録の話勝敗は常に見積もりで決まる〜Redmineを使った時間記録の話
勝敗は常に見積もりで決まる〜Redmineを使った時間記録の話心 谷本
 
日本で二番目に「細かい」JavaOne2011報告
日本で二番目に「細かい」JavaOne2011報告日本で二番目に「細かい」JavaOne2011報告
日本で二番目に「細かい」JavaOne2011報告心 谷本
 
[関ジャバ]Java News 2011 Mar
[関ジャバ]Java News 2011 Mar[関ジャバ]Java News 2011 Mar
[関ジャバ]Java News 2011 Mar心 谷本
 

Mehr von 心 谷本 (11)

JJUG CCC 2015 Fall keynote
JJUG CCC 2015 Fall keynoteJJUG CCC 2015 Fall keynote
JJUG CCC 2015 Fall keynote
 
Spring Bootをはじめる時にやるべき10のこと
Spring Bootをはじめる時にやるべき10のことSpring Bootをはじめる時にやるべき10のこと
Spring Bootをはじめる時にやるべき10のこと
 
Spring Boot + Netflix Eureka
Spring Boot + Netflix EurekaSpring Boot + Netflix Eureka
Spring Boot + Netflix Eureka
 
プレゼンの技術 2 実践編
プレゼンの技術 2 実践編プレゼンの技術 2 実践編
プレゼンの技術 2 実践編
 
プレゼンの技術 1 考え方
プレゼンの技術 1 考え方プレゼンの技術 1 考え方
プレゼンの技術 1 考え方
 
プレゼンの技術
プレゼンの技術プレゼンの技術
プレゼンの技術
 
実例Javaトラブルシューティング! 〜稼働中のシステムを立て直した半年間の軌跡
実例Javaトラブルシューティング! 〜稼働中のシステムを立て直した半年間の軌跡実例Javaトラブルシューティング! 〜稼働中のシステムを立て直した半年間の軌跡
実例Javaトラブルシューティング! 〜稼働中のシステムを立て直した半年間の軌跡
 
日本一細かいJavaOne2011報告
日本一細かいJavaOne2011報告日本一細かいJavaOne2011報告
日本一細かいJavaOne2011報告
 
勝敗は常に見積もりで決まる〜Redmineを使った時間記録の話
勝敗は常に見積もりで決まる〜Redmineを使った時間記録の話勝敗は常に見積もりで決まる〜Redmineを使った時間記録の話
勝敗は常に見積もりで決まる〜Redmineを使った時間記録の話
 
日本で二番目に「細かい」JavaOne2011報告
日本で二番目に「細かい」JavaOne2011報告日本で二番目に「細かい」JavaOne2011報告
日本で二番目に「細かい」JavaOne2011報告
 
[関ジャバ]Java News 2011 Mar
[関ジャバ]Java News 2011 Mar[関ジャバ]Java News 2011 Mar
[関ジャバ]Java News 2011 Mar
 

from old java to java8 - KanJava Edition