List<Beans>
をList<Beansの一部>
に変換するには、変換後のList<Beansの一部>
を変数宣言して、List<Beans>
をfor文でループしながら追加するという、面倒くさい処理が必要だった。
Java8で導入されるlambdaを使って書けば、一文で処理できる。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* List<Beans>をList<Beansの一部>にlambdaを使って一行で変換する
*/
public class Main {
public static void main(String[] args) {
Main m = new Main();
// DTOを取得する
List<Dto> dtos = m.getDtos();
// DTOの内、主キーだけをリストとして取り出す。
List<String> keys = dtos.stream() // Streamを取得してlambdaを使用できるようにする
.map(dto -> dto.key) // Streamの全要素に関数を適用する。
.collect(Collectors.toList()); // StreamをListに変形する。
// lambdaを使わなければforでループしなければいけない。
List<String> keys_ = new ArrayList<>();
for (Dto dto : dtos) {
keys_.add(dto.key);
}
// 主キーを順次表示する。
keys.stream().forEach(System.out::println);
// こちらの表記でもOK
keys_.stream().forEach(x -> System.out.println(x));
}
/**
* DBからデータを取り出すモック
* @return DTO
*/
private List<Dto> getDtos() {
List<Dto> dtos = Arrays.asList(
new Dto("key1", "x1")
, new Dto("key2", "x2")
);
return dtos;
}
}
class Dto {
public Dto(String key, String x) {
this.key = key;
this.x = x;
}
String key;
String x;
}
よくある処理として、Dtoの主キーをもとに、処理対象かどうかを判別するコードも次のように簡潔に書ける。
String targetKey = "key1";
boolean requireProc = dtos.stream().anyMatch(dto -> Objects.equals(dto.key, targetKey));