2016-10-09 4 views
2

In java8 zu instanziiert, bekam ich einen Satz von String:-Stream verwenden, um neue Objekte

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

Und ich mag eine Liste von People zu bekommen, den Namen People basierend auf dem String aus dem Set Einstellung. Allerdings People Klasse keinen Konstruktor wie new People(name) haben, kann es nur unter Verwendung setName Methode implementiert werden.

In alter Art und Weise kann ich so etwas tun:

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

Wie kann ich Stream verwenden, um dies zu konvertieren?

+0

Klassennamen sollten im Allgemeinen Singular sein (sofern nicht jede Instanz eine Sammlung von Elementen darstellt). Sie sollten Ihre Klasse "Person" nennen. – shmosel

Antwort

5

Wenn möglich, kann es sich lohnen, einen People Konstruktor hinzuzufügen, der einen Namen erhält. Dann könnten Sie dies tun:

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

Wenn Sie keinen Konstruktor hinzufügen können, können Sie entweder tun es wie folgt aus:

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

Oder besser meiner Meinung nach:

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

Und anderswo im Code haben diese Methode, vielleicht in einer PeopleUtils Klasse:

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

Vielleicht auch in Betracht ziehen, die Klasse People in Person umzubenennen.

+0

Ich denke 'Builder Muster' wäre die Wahl. :) –

Verwandte Themen