使用Stream实例化新对象

chr*_*ina 3 java java-8 java-stream

java8,我有一组字符串:

final Set<String> nameSet = this.getNames();
Run Code Online (Sandbox Code Playgroud)

我想得到一个列表People,People根据字符串设置名称Set.但是,People类没有类似的构造函数new People(name),它只能通过using setName方法实现.

以旧方式,我可以做类似的事情:

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

我怎么能用它Stream来转换呢?

msa*_*ord 5

如果可能,可能值得考虑添加一个People带名称的构造函数.然后你可以这样做:

List<People> peoples = nameSet.stream()
  .map(People::new)
  .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

如果你不能添加构造函数,你可以这样做:

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

或者在我看来更好:

List<People> peoples = nameSet.stream()
  .map(name -> createPeopleFromName(name))
  .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

代码中的其他地方有这个方法,也许在一个PeopleUtils类中:

public static People createPeopleFromName(String name)
{
  People people = new People();
  people.setName(name);
  return people;
}
Run Code Online (Sandbox Code Playgroud)

也许还考虑将类重命名PeoplePerson.