More Related Content
Similar to from old java to java8 - KanJava Edition (20)
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エンジニアの会 主催
- 8. 自己紹介
• 名前 : 谷本 心 (たにもと しん)
• 職業 : Javaエンジニア / トラブルシューター
トラブルシュート教育も引き受けます!
• Twitter : @cero_t
• その他 : 日本Javaユーザ会(JJUG) 幹事
関西Javaエンジニアの会 主催
- 17. from old Java
to modern Java
∼ レビューで学ぶJava8時代のコーディング作法
Acroquest Technology株式会社
JJUG / 関西Javaエンジニアの会
谷本 心 ( @cero_t )
- 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()));
}
- 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;
}
- 31. from old Java
to modern Java
∼ 老害にならないためのJava8入門
Acroquest Technology株式会社
JJUG / 関西Javaエンジニアの会
谷本 心 ( @cero_t )
- 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ですよね!
- 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!
- 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;
}
- 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);
}
}
一気に読み込むのは便利だけど、
ヒープメモリもたくさん使っちゃう
し、それぞれの行に対する処理が
必要な場合は、どうしてもループを
回し直さなきゃいけないよね。
- 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;
}
- 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);
}
}
外部のオブジェクトを
操作しない方が安心。
- 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);
}
}
- 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とか使うよねー
- 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();
}
じゃ、こういうパター
ンはどうするの?
- 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ドルを超える社員
の数を部署ごとに集計する
- 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
- 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()));
}
- 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()));
}
- 86. from old Java
to modern Java
∼ 老害にならないためのJava8入門
Acroquest Technology株式会社
JJUG / 関西Javaエンジニアの会
谷本 心 ( @cero_t )