きり丸の技術日記

技術・エンジニアのイベント・資格等はこちらにまとめる予定です

【Java】ListでNestしている時に処理を簡単にするためにフラットにしたい

つい最近まで、ListのListのListの…
といったドメインがNestされるとラムダ式でうまく取り出せなかったのが、Javaでようやく取り出せるようになったのでメモ。

当然、ラムダ式使わない方法はあるんですが、知ることでと幅が広がるので…。
なお、メソッド参照を使ってますが、使わなくてもいいと思います。

メソッド参照は、慣れると余計なことをしていないことが分かるので便利です。

やりたいこと

以下のデータ構造の時に、申込に紐づく返品履歴をListで全部取得したい。

データ構造

  • 申込
    • List<詳細>
      • List<返品履歴>

取得後の結果。

  • List<返品履歴>

コード

public class Entry {
  private List<Detail> detail;

  public List<ReturnHistory> flatHistory() {
    return Optional.ofNullable(detail).stream() // detailがNullを回避
        .flatMap(Collection::stream) // stream化
        .map(Detail::getReturnHistory) // List<List<返品履歴>>
        .filter(Objects::nonNull) // 返品履歴がnullを回避
        .flatMap(Collection::stream) // stream化
        .collect(Collectors.toList());
  }
}

public class Detail {
  private List<ReturnHistory> returnHistory;
}

public class ReturnHistory {
  private String id;
  private LocalDateTime date;
}

この記事のターゲット

上手くいかなかった理由

  • 明細がnullの場合をラムダ式で回避できなかった
  • ListのListの時のflatMapの使い方がわからなかった

ソースコード

リポジトリ

github.com

この処理があるクラス
github.com

テストクラス

github.com