Можно ли выполнить эту операцию в одну строку? - PullRequest
0 голосов
/ 21 сентября 2019

Предполагая, что список firstName уже инициализирован.

List<String> firstName= new ArrayList<String>();
firstName.add("John");
firstName.add("Peter");
firstName.add("Foo");

Можно ли использовать его для заполнения другого списка всего одной строкой кода?Я не знаю, как сделать это в несколько строк, чем следующие:

List<FullName> fullName= new ArrayList<FullName>();
firstName.stream().forEach( n -> fullName.add(new FullName(n, "SomeSurname")));

1 Ответ

6 голосов
/ 21 сентября 2019

Это легко сделать, используя map вместо forEach для создания FullName s, затем Collectors.toList для создания списка.

firstName.stream().map(n -> new FullName(n, "SomeSurname")).collect(Collectors.toList());

Это не только одно утверждение, предпочтительнее сделать так , если есть возможность параллельных потоков, чтобы избежать проблем параллелизма.Кроме того, нежелательно использовать forEach, обычно используемый для побочных эффектов, в качестве основной цели, которую здесь собирают в список.

Кроме того, вам не следует беспокоиться о том, что это всего одна строка.Читаемость важнее, чем скупость на количество строк.Это было сделано в одно утверждение, даже если это несколько строк.Обычно каждая операция в потоке Java отделяется отдельной строкой.

firstName.stream()
    .map(n -> new FullName(n, "SomeSurname"))
    .collect(Collectors.toList());

Если вы хотите, вы можете даже объединить создание начального списка в один оператор.

List<FullName> fullName = Arrays.asList("John", "Peter", "Foo").stream()
    .map(n -> new FullName(n, "SomeSurname"))
    .collect(Collectors.toList());
...