2016-10-09 4 views
2

В java8, я получил набор строки:Использование потока для создания экземпляров новых объектов

final Set<String> nameSet = this.getNames(); 

И я хочу, чтобы получить список People, устанавливая имя People на основе строки из Set. Однако класс People не имеет такого конструктора, как new People(name), его можно реализовать только с помощью метода setName.

В старинке, я могу сделать что-то вроде:

List<People> peoples = new ArrayList<People>(); 
    for(String name: nameSet){ 
     People people = new People(); 
     people.setName(name); 
     peoples.add(people); 
    } 

Как я мог бы использовать Stream преобразовать это?

+0

Названия классов обычно должны быть сингулярными (если только каждый экземпляр представляет собой набор элементов). Вероятно, вы должны назвать свой класс 'Person'. – shmosel

ответ

5

Если возможно, возможно стоит рассмотреть возможность добавления конструктора People, который берет имя. Тогда вы могли бы сделать это:

List<People> peoples = nameSet.stream() 
    .map(People::new) 
    .collect(Collectors.toList()); 

Если вы не можете добавить конструктор, вы можете сделать это следующим образом:

List<People> peoples = nameSet.stream() 
    .map(name -> { 
    People people = new People(); 
    people.setName(name); 
    return people; 
    }).collect(Collectors.toList()); 

Или лучше на мой взгляд:

List<People> peoples = nameSet.stream() 
    .map(name -> createPeopleFromName(name)) 
    .collect(Collectors.toList()); 

И в другом месте кода этот метод, возможно, находится в классе PeopleUtils:

public static People createPeopleFromName(String name) 
{ 
    People people = new People(); 
    people.setName(name); 
    return people; 
} 

Возможно также рассмотреть возможность переименования класса People в Person.

+0

Я думаю, что «шаблон строителя» будет выбором. :) –

Смежные вопросы