オブジェクトのリストを別のオブジェクトのリストに変換する方法

Java で開発していると、データベースから取得した Entity のリストから画面表示用の DTO のリストへ変換するようなシチュエーションがあると思われる。 他にも、オブジェクトのリストから別のオブジェクトのリストに変換する機会はあると思う。
java8 から追加された java.util.stream.Stream クラスの map() メソッドを使用すると簡単に変換できる。


変換元となるクラス
@Data
@Entity
public class CountDO {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private Long count;

    @Column
    private Long size;

    @Column
    private Long recordTime;

}


変換先となるクラス
@Data
public class CountDTO {
    
    private Long value;

    private Long timestamp;


    /**
     * countDOからCountDTOを作成。(CountとRecordTimeを取り出す)
     * @param countDO
     * @return
     */
    public static CountDTO valueOf(CountDO countDO) {
        CountDTO countDTO =  new CountDTO();
        countDTO.setValue(countDO.getCount());
        countDTO.setTimestamp(countDO.getRecordTime());

        return countDTO;
    }

CountDTOは、CountDOからcountとrecordTimeの二つのカラムだけを取り出したクラスである。

ここではただ取り出しただけであるが、valueOfメソッドの中身を変えれば好きなように変換できる。


変換作業
//firstTimeからlastTimeまでのcountDOを全て取得
List<CountDO> countDOList = countDAO.getAll(firstTime, lastTime);
       
//countDOのリストをcountDTOのリストに変換
List<CountDTO> CountDTOList = countDOList.stream().map(CountDTO::valueOf).collect(Collectors.toList());

ここではstreamの詳しい説明は省略する。

mapメソッドは、streamクラスの一つ一つを引数に取り、何らかの処理を行うメソッドである。ここではラムダ表記のため引数等は省略されている。

mapメソッドでvalueOfの変換が行われ(何らかの処理がここではvalueOfの変換)、最後にcollect(Collectors.toList())で再びリストにしている。

これで変換作業は終わり!