Продолжить отображение после сбора потока - PullRequest
0 голосов
/ 18 сентября 2018

Как продолжить отображение потока после сбора:

public Bus createBus(List<String> passengers) {
   return passengers.stream()
             .map(name -> new Person(name))
             .collect(Collectors.toList())
             .map(personList -> new Bus(personList))
}

Выше, очевидно, не работает.Как заставить его работать элегантно без использования каких-либо переменных в теле метода?

Редактировать: Конструктор - это шина (список лиц).

Ответы [ 4 ]

0 голосов
/ 18 сентября 2018

Вы можете использовать Collector из Collectors.collectingAndThen для выполнения дополнительного завершающего преобразования:

public Bus createBus(List<String> passengers) {
    return passengers.stream()
            .map(name -> new Person(name))
            .collect(Collectors
                    .collectingAndThen(Collectors.toList(),people -> new Bus(people)));
}
0 голосов
/ 18 сентября 2018

map будет повторяться для каждого Person в вашем списке. Похоже, что вашему Bus нужен весь список в качестве параметра. На самом деле вы пытаетесь создать новый Bus для каждого имени в списке passengers.

Вы можете передать собранный список непосредственно в конструктор:

public Bus createBus(List<String> passengers) {
   return new Bus(passengers.stream()
             .map(name -> new Person(name))
             .collect(Collectors.toList()));
}

или сохраните его в переменной (что мне кажется более понятным):

public Bus createBus(List<String> passengers) {
   List<Person> persons = passengers.stream()
             .map(name -> new Person(name))
             .collect(Collectors.toList());
   return new Bus(persons);
}
0 голосов
/ 18 сентября 2018

Предполагая, что Bus имеет List из Person объектов:

public Bus createBus(List<String> passengers) {
   return new Bus(passengers.stream().map(name -> new Person(name)).collect(Collectors.toList()));
}


Другой вариант:

public Bus createBus(List<String> passengers) {
    return new Bus(getPersons(passengers));
}

private List<Person> getPersons(List<String> passengers) {
    return passengers.stream().map(name -> new Person(name)).collect(Collectors.toList());
}
0 голосов
/ 18 сентября 2018

Поскольку collect возвращает коллекцию, вам нужно открыть новый поток в новом собранном списке:

 list.stream().map(name -> new Person(name))
         .collect(Collectors.toList())
         .stream()....

или просто удалите collect: list.stream().map(name -> new Person(name)).map(...). Это имело бы гораздо больше смысла в вашем случае

...