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の内容をカバーしています。

Takuya Sugawara

May 27, 2021
Tweet

Other Decks in Technology

Transcript

  1. 7

  2. 15

  3. ラムダ式の追加(#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
  4. ラムダ式の追加(#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
  5. 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
  6. 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
  7. 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
  8. varによるローカル変数の型推論(#Java10, #Java11) 最近の静的型付け⾔語は⼤体備えているローカル変数の型推論にやっと対応。 String hoge = "hogehoge"; ArrayList<String> alist =

    new ArrayList<String>(); var hoge = "hogehoge"; var alist = new ArrayList<String>(); 右辺で決まっている型をわざわざ宣⾔しないといけない煩わしさから解放されます。 書くとき少し楽になるかな、といった印象。 25
  9. 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
  10. After int numLetters = switch (day) { case MONDAY, FRIDAY,

    SUNDAY -> 6; case TUESDAY -> 7; case THURSDAY, SATURDAY -> 8; case WEDNESDAY -> 9; }; 式として値を受け取れるようになったSwitch⽂︕ラムダ式⾵に戻り値を指定可能。 複数Caseをカンマ区切りで指定可能に︕ 28
  11. テキストブロック(#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
  12. 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
  13. 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