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));