2015-06-03 28 views
38

Tôi có số List<Person>. Tôi cần có một số List từ một tài sản của Person.Làm cách nào để lấy Danh sách từ một số thuộc tính lớp với Java 8 Stream?

Ví dụ, tôi có một lớp 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")); 

Tôi muốn để có được danh sách tên với Stream API như thế này:

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

#David 
#Joe 
#Michel 
#Barak 

Mã này không làm việc:

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; 
    } 
} 


Cách tôi có thể nhận được số List của một thuộc tính với số Stream API không?

Trả lời

102

Đó là cơ bản, bạn sử dụng map:

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

EDIT:

Nhằm gắn bó Danh mục tên người bạn, bạn cần phải sử dụng flatMap:

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

Cảm ơn. Làm thế nào tôi có thể hợp nhất nhiều danh sách các chuỗi mà tôi đã nhận với .map (Person :: getFriends); – NCNecros

+1

@NCNecros Điều đó phụ thuộc vào đầu vào là gì. Tôi không hiểu những gì bạn đang cố gắng làm trong mã mà bạn đã thêm vào câu hỏi. – Eran

+0

@Eran Nó có xử lý trường hợp khi danh sách trống không? – Joy

Các vấn đề liên quan