2015-06-03 43 views
38

我有一个List<Person>。我需要从Person的物业获得List如何从Java 8 Stream的某些类属性获取List?

例如,我有一个Person类:

class Person 
{ 
    private String name; 
    private String birthDate; 
    public String getName() { 
     return name; 
    } 
    public String getBirthDate() { 
     return birthDate; 
    } 
    Person(String name) { 
     this.name = name; 
    } 
} 

List<Person> personList = new ArrayList<>(); 
personList.add(new Person("David")); 
personList.add(new Person("Joe")); 
personList.add(new Person("Michel")); 
personList.add(new Person("Barak")); 

我想名单与Stream API这样的:

List<String> names = personList.stream().somecode().collect(Collectors.toList()); 
names.stream().forEach(System.out::println); 

#David 
#Joe 
#Michel 
#Barak 

此代码不起作用:

public class Main 
{ 
    public static void main(String[] args) 
    { 
     List<Person> personList = new ArrayList<>(); 
     Person person = new Person("Иван"); 
     person.getFriends().addAll(Arrays.asList("Друг 1", "Друг 2", "Друг 3")); 
     personList.add(person); 
     person = new Person("Федор"); 
     person.getFriends().addAll(Arrays.asList("Друг 4", "Друг 5", "Друг 6")); 
     personList.add(person); 
     person = new Person("Алексей"); 
     person.getFriends().addAll(Arrays.asList("Друг 7", "Друг 8", "Друг 9")); 
     personList.add(person); 
     person = new Person("Константин"); 
     person.getFriends().addAll(Arrays.asList("Друг 10", "Друг 11", "Друг 12")); 

     List<String> friens = personList.stream().map(e->e.getFriends()).collect(Collectors.toList()); 

     friends.stream().forEach(System.out::println); 
     //Друг 1 
     //Друг 2 
     //Друг 3 
     //Друг 4 
     //... 

    } 
} 

class Person 
{ 
    String name; 
    List<String> friends; 

    Person(String name) { 
     this.name = name; 
    } 
    public String getName() { 
     return name; 
    } 

    public List<String> getFriends() { 
     return friends; 
    } 
} 


How我可以通过Stream API获得List的房产吗?

回答

102

这是基本的,你用map

List<String> names = 
    personList.stream() 
       .map(Person::getName) 
       .collect(Collectors.toList()); 

编辑:

为了朋友名字的名单组合,你需要使用flatMap

List<String> friendNames = 
    personList.stream() 
       .flatMap(e->e.getFriends().stream()) 
       .collect(Collectors.toList()); 
+0

感谢。我如何合并很多我用.map(Person :: getFriends)获得的字符串列表; – NCNecros

+1

@NCNecros这取决于什么是输入。我不明白你在添加到问题中的代码中想要做什么。 – Eran

+0

@Eran当列表为空时,它会处理这种情况吗? – Joy