Làm cách nào tôi có thể nhận Danh sách từ một số thuộc tính lớp với Luồng Java 8?


134

Tôi có một List<Person>. Tôi cần phải có được Listmột tài sản của Person.

Ví dụ, tôi có một Personlớp:

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 nhận danh sách các tên bằng StreamAPI, 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 hoạt động:

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


Làm cách nào tôi có thể có được Listmột tài sản với StreamAPI?

Câu trả lời:


310

Bạn có thể sử dụng map:

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

BIÊN TẬP :

Để kết hợp Danh sách tên bạn bè, bạn cần sử dụng flatMap:

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

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 có 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ã bạn đã thêm vào câu hỏi.
Eran

@Eran Nó sẽ xử lý trường hợp khi danh sách trống?
Niềm vui

1
@NagabhushanSN Bạn có thể lặp lại với vòng lặp foreach, vòng lặp truyền thống hoặc vòng lặp while, nhưng bạn phải sử dụng một số vòng lặp.
Eran

1
@PAA thêm một cuộc gọi bộ lọc trước FlatMap:.filter(e->e.getFriends() != null)
Eran
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.