Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Javaはレガシー言語からモダンな言語へ。どこまで知ってる?Java最新事情!

 Javaはレガシー言語からモダンな言語へ。どこまで知ってる?Java最新事情!

Javaと聞くとレガシーなイメージがありませんか?実はそんなことはなく、現在も半年に1回のペースでメジャーバージョンが上がっています。最近のJavaはKotlinさながらとても書きやすくなっています。今回は、そんなJavaの進化をバージョンの変遷を追ってお伝えします。ベーシックなJava開発から、最新のAPIを使った開発まで一気にアップデートしていきましょう。
本記事はJava7~16の内容をカバーしています。

C5e38aded23582f3b8e22b985eaf440e?s=128

Takuya Sugawara

May 27, 2021
Tweet

Transcript

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

  2. ⾃⼰紹介 名前 菅原 拓也 経歴 2017年 経済学部卒 同年 9⽉新卒でFutureに⼊社 やってきたこと

    アプリ設計・開発がメイン Java, JS, Python (Kotlin, Dart) 2
  3. ⽬次 会社紹介 昨今のJavaの変化ポイント 劇的ビフォーアフター 3

  4. 会社概要 4

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

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

  7. 7

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

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

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

  11. 本当にレガシー⾔語︖ 11

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

  13. 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

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

  15. 15

  16. Java8(2014年) 16

  17. ラムダ式の追加(#Java8) Before List.of(1, 2, 3).sort(new Comparator<Integer>() { @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
  18. ラムダ式の追加(#Java8) Before List<Integer> 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
  19. Collectionの操作 19

  20. Stream API(#Java8) Before List<Integer> list = Arrays.asList(1, 2, 3, 4,

    5); for (Integer i : list) { if (i % 3 == 0) { System.out.println(i); } } After List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); list.stream() .filter(i -> i % 3 == 0) .forEach(System.out::println); →とてもすっきりして読みやすい。 c.f.)Kotlin(Iterable) 20
  21. Null安全性の担保 21

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

  25. varによるローカル変数の型推論(#Java10, #Java11) 最近の静的型付け⾔語は⼤体備えているローカル変数の型推論にやっと対応。 String hoge = "hogehoge"; ArrayList<String> alist =

    new ArrayList<String>(); var hoge = "hogehoge"; var alist = new ArrayList<String>(); 右辺で決まっている型をわざわざ宣⾔しないといけない煩わしさから解放されます。 書くとき少し楽になるかな、といった印象。 25
  26. HTTP/2.0への対応(#Java11) (⻑いのでソース略) Javaがもともと備えているHttpUrlConnection(Java1.1〜)はHTTP/2.0⾮対応。 記述量も多く、かなりつらかったのが、標準APIで簡単に記述できるようになった。 うれしい。 26

  27. 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
  28. After int numLetters = switch (day) { case MONDAY, FRIDAY,

    SUNDAY -> 6; case TUESDAY -> 7; case THURSDAY, SATURDAY -> 8; case WEDNESDAY -> 9; }; 式として値を受け取れるようになったSwitch⽂︕ラムダ式⾵に戻り値を指定可能。 複数Caseをカンマ区切りで指定可能に︕ 28
  29. テキストブロック(#Java15) Before String html = "<html>\n" + " <body>\n" +

    " <p>Hello, world</p>\n" + " </body>\n" + "</html>\n"; After String html = """ <html> <body> <p>Hello, world</p> </body> </html> """; c.f.)Kotlin (raw string) 29
  30. 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
  31. After public record SomeData (String id, String name){} →感動するほど簡潔︕ なお、ImutableなクラスなのでSetterは表現させていません。

    c.f.)Kotlin (data class) 31
  32. 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
  33. Sealed Class(GA未定) 継承先を指定できる機能。 sealed interface Shape permits Circle, Rectangle {

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

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