つい最近まで、ListのListのListの…
といったドメインがNestされるとラムダ式でうまく取り出せなかったのが、Javaでようやく取り出せるようになったのでメモ。
当然、ラムダ式使わない方法はあるんですが、知ることでと幅が広がるので…。
なお、メソッド参照を使ってますが、使わなくてもいいと思います。
メソッド参照は、慣れると余計なことをしていないことが分かるので便利です。
やりたいこと
以下のデータ構造の時に、申込に紐づく返品履歴をListで全部取得したい。
データ構造
- 申込
- 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
テストクラス