2016-10-09 37 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

我認爲'建設者模式'將是選擇。 :) –