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

モダンなJavaの書き方

 モダンなJavaの書き方

2021.02.25
TECH Street
Javaエンジニア勉強会資料

Yuichi.Sakuraba

March 01, 2021
Tweet

More Decks by Yuichi.Sakuraba

Other Decks in Technology

Transcript

  1. 自己紹介 • Java歴 26年 ◦ Java 1.0αから ◦ 2005年 Java

    Champion ◦ 2007年 JJUG創設メンバー • Client Side Java ◦ Java SE, JavaFX • 各種著作 ◦ Web+DB Press 連載 “見なおそう! モダンJavaの流儀” ◦ 書籍 Java SE 7/8 速攻入門
  2. Javaのトレンド 可読性の重視 関数の活用 Immutable var switch式 ラムダ式 ... ラムダ式 Stream

    API Flow (Reactive Stream) Record Immutable Collection Factory Javaの機能
  3. Javaのトレンド 可読性の重視 関数の活用 Immutable var switch式 ラムダ式 ... ラムダ式 Stream

    API Flow (Reactive Stream) Record Immutable Collection Factory Javaの機能 Java 8 Java 11LTS Java 17LTS
  4. public Map<Integer, Long> convert(List<Customer> customers) { Map<Integer, Long> productCountMap =

    new HashMap<>(); for (int i = 0; i < customers.size(); i++) { Customer customer = customers.get(i); List<Integer> ids = customer.getHistory(); for (int j = 0; j < ids.size(); j++) { int pId = ids.get(j); Long productCount = productCountMap.get(pId); if (productCount == null) { productCountMap.put(pId, 1L); } else { productCount++; productCountMap.put(pId, productCount); } } } return productCountMap; } いにしえの書き方
  5. public Map<Integer, Long> convert(List<Customer> customers) { Map<Integer, Long> productCountMap =

    new HashMap<>(); for (int i = 0; i < customers.size(); i++) { Customer customer = customers.get(i); List<Integer> ids = customer.getHistory(); for (int j = 0; j < ids.size(); j++) { int pId = ids.get(j); Long productCount = productCountMap.get(pId); if (productCount == null) { productCountMap.put(pId, 1L); } else { productCount++; productCountMap.put(pId, productCount); } } } return productCountMap; } いにしえの書き方 ミュータブルなマップ ループ制御とロジックが混在 分かりにくいループカウンター NullPointerExceptionが発生するため オートボクシングができない
  6. public Map<Integer, Long> convert(List<Customer> customers) { Map<Integer, Long> productCountMap =

    new HashMap<>(); for (Customer customer: customers) { List<Integer> ids = customer.getHistory(); for (int pId: ids) { Long productCount = productCountMap.get(pId); if (productCount == null) { productCountMap.put(pId, 1L); } else { productCount++; productCountMap.put(pId, productCount); } } } return productCountMap; } Java 5だったら for-each文に変更
  7. public Map<Integer, Long> convert(List<Customer> customers) { Map<Integer, Long> productCountMap =

    customers.stream() .flatMap(customer -> customer.getHistory().stream()) .collect(Collectors.groupingBy(pId -> pId, Collectors.counting())); return productCountMap; } Java 8以降 マップの要素を変更しないので Immutableにすることも可能 2重ループの展開 トリッキーなif文の排除