Slide 1

Slide 1 text

Future Tech Night #10 Javaはレガシー⾔語からモダンな⾔語へ。どこまで知ってる︖Java最新事情︕ 1

Slide 2

Slide 2 text

⾃⼰紹介 名前 菅原 拓也 経歴 2017年 経済学部卒 同年 9⽉新卒でFutureに⼊社 やってきたこと アプリ設計・開発がメイン Java, JS, Python (Kotlin, Dart) 2

Slide 3

Slide 3 text

⽬次 会社紹介 昨今のJavaの変化ポイント 劇的ビフォーアフター 3

Slide 4

Slide 4 text

会社概要 4

Slide 5

Slide 5 text

仕事の進め⽅ 上流から下流まで⼀気通貫のITコンサルティングをウリにしています。 5

Slide 6

Slide 6 text

技術特化部隊もあります 6

Slide 7

Slide 7 text

7

Slide 8

Slide 8 text

本⽇お話すること Java標準APIのバージョン変遷 お話しないこと JVM, GC関連のアップデート Java7より前の話 8

Slide 9

Slide 9 text

私のJava経験 新⼈研修でやった⺟語はJava。 業務ではJava7〜Java11まで3年くらい触っている。 9

Slide 10

Slide 10 text

Javaってどんなイメージ︖ 冗⻑︖ ぬるぽ︖ ビルドが遅い︖ 10

Slide 11

Slide 11 text

本当にレガシー⾔語︖ 11

Slide 12

Slide 12 text

後⽅互換性がしっかりしているため、 古い書き⽅をいつまでも許してくれる⾔語。 12

Slide 13

Slide 13 text

Javaのバージョンアップ OpenJDKはJava9(2017/9)より半年に1回の新リリースサイクルへ 3年に1度のLTSリリース 「JDKの新しいリリース・モデルおよび提供ライセンスについて」 https://www.oracle.com/jp/technical-resources/article/java/ja-topics/jdk-release- model.html 13

Slide 14

Slide 14 text

昨今のJavaの変化ポイント Java8での⼤型リリース 関数型プログラミングのパラダイムが導⼊ ソース量を減らすあれこれ導⼊ プロジェクトAmberの動向 モダン⾔語を⽬指した⾔語拡張 14

Slide 15

Slide 15 text

15

Slide 16

Slide 16 text

Java8(2014年) 16

Slide 17

Slide 17 text

ラムダ式の追加(#Java8) Before List.of(1, 2, 3).sort(new Comparator() { @Override public int compare(final Integer o1, final Integer o2) { return o1 - o2; } }); After List.of(1, 2, 3).sort((o1, o2) -> o1 - o2); 17

Slide 18

Slide 18 text

ラムダ式の追加(#Java8) Before List list = Arrays.asList(1, 2, 3, 4, 5); // for⽂での記述 for(int i = 0; i < list.size(); i++) { System.out.println(l.get(i)); } After // ラムダ式(メソッド参照)の記述 list.stream().forEach(System.out::println); 18

Slide 19

Slide 19 text

Collectionの操作 19

Slide 20

Slide 20 text

Stream API(#Java8) Before List list = Arrays.asList(1, 2, 3, 4, 5); for (Integer i : list) { if (i % 3 == 0) { System.out.println(i); } } After List list = Arrays.asList(1, 2, 3, 4, 5); list.stream() .filter(i -> i % 3 == 0) .forEach(System.out::println); →とてもすっきりして読みやすい。 c.f.)Kotlin(Iterable) 20

Slide 21

Slide 21 text

Null安全性の担保 21

Slide 22

Slide 22 text

Optional(#Java8) Before String title = findMovieById(id); if (title != null) { System.out.println("映画のタイトル: " + title) } After Optional.ofNullable(findMovieById(id)) .ifPresent (() -> System.out.println("映画のタイトル: " + title)); →基本的には外部リソースへのアクセスを戻すメソッドは、Optionalで受けるとぬるぽ 対策できて安⼼。 c.f.)Kotlin, C#(型の後の?) 22

Slide 23

Slide 23 text

Date and Time API(#Java8) Before Calendar cl = Calendar.getInstance(); System.out.println("YEAR︓" + cl.get(Calendar.YEAR)); System.out.println("MONTH︓" + cl.get(Calendar.MONTH)); System.out.println("DAY︓" + cl.get(Calendar.DATE)); // YEAR: 2021 // MONTH: 4 (※5⽉だよ) // DAY: 21 final Date d1 = new Date(); System.out.println(d1.getTime()); // 1621564228929 (※いつ︖) ほかにも、タイムゾーンを扱えなかったり、加算減算を気軽にできない点、 Mutableでマルチスレッドで動かすと予期しないバグを⽣んだり、いろいろ不便。。 23

Slide 24

Slide 24 text

After ⼈が認識しやすい年、⽉、⽇、時、分、秒などの単位で⽇時を扱うクラスが登場 ZonedDateTime LocalDateTime YearMonth Year etc c.f.)Kotlin(Date) 24

Slide 25

Slide 25 text

varによるローカル変数の型推論(#Java10, #Java11) 最近の静的型付け⾔語は⼤体備えているローカル変数の型推論にやっと対応。 String hoge = "hogehoge"; ArrayList alist = new ArrayList(); var hoge = "hogehoge"; var alist = new ArrayList(); 右辺で決まっている型をわざわざ宣⾔しないといけない煩わしさから解放されます。 書くとき少し楽になるかな、といった印象。 25

Slide 26

Slide 26 text

HTTP/2.0への対応(#Java11) (⻑いのでソース略) Javaがもともと備えているHttpUrlConnection(Java1.1〜)はHTTP/2.0⾮対応。 記述量も多く、かなりつらかったのが、標準APIで簡単に記述できるようになった。 うれしい。 26

Slide 27

Slide 27 text

Switchを式として扱う(#Java14) Before int numLetters = 0; switch(day) { case MONDAY: case FRIDAY: case SUNDAY: numLetters = 6; break; case TUESDAY: numLetters = 7; break; case THURSDAY: case SATURDAY: numLetters = 8; break; case WEDNESDAY numLetters = 9; break; default: break; } 27

Slide 28

Slide 28 text

After int numLetters = switch (day) { case MONDAY, FRIDAY, SUNDAY -> 6; case TUESDAY -> 7; case THURSDAY, SATURDAY -> 8; case WEDNESDAY -> 9; }; 式として値を受け取れるようになったSwitch⽂︕ラムダ式⾵に戻り値を指定可能。 複数Caseをカンマ区切りで指定可能に︕ 28

Slide 29

Slide 29 text

テキストブロック(#Java15) Before String html = "\n" + " \n" + "

Hello, world

\n" + " \n" + "\n"; After String html = """

Hello, world

"""; c.f.)Kotlin (raw string) 29

Slide 30

Slide 30 text

Recordクラス(#Java16) public class Member { private String id; private String name; public Member() { } public String getId() { return id; } public String getName() { return name; } @Override public int hashCode() { // 略 } @Override public boolean equals(Object other) { // 略 } @Override public String toString() { // 略 } 30

Slide 31

Slide 31 text

After public record SomeData (String id, String name){} →感動するほど簡潔︕ なお、ImutableなクラスなのでSetterは表現させていません。 c.f.)Kotlin (data class) 31

Slide 32

Slide 32 text

instanceOfのパターンマッチング(#Java16) Before if (obj instanceof String) { String s = (String)obj; // キャストするのが⾯倒くさい ... } After if (obj instanceof String s) { // sがStringとして扱える ... } c.f.) Kotlin(is), C#(is)... 32

Slide 33

Slide 33 text

Sealed Class(GA未定) 継承先を指定できる機能。 sealed interface Shape permits Circle, Rectangle { ... } c.f.) Kotlin(sealed class), C#(sealed class) 33

Slide 34

Slide 34 text

Javaはまだまだ根強い⼈気。 TIOBEの世界⼈気⾔語ランキング(2021)ではC, Pythonに次いでJavaは3位。 まだまだ根強い⼈気を誇るプログラミング⾔語。 34

Slide 35

Slide 35 text

Let's Javaでモダンプログラミング︕ 記事版はこちら。「Java7からJava16までの変遷。」https://qiita.com/sivertigo/items/8f61f02f7c84b786697a 35