Java 8 Stream을 사용하여 일부 클래스 속성에서 List를 얻으려면 어떻게해야합니까?


134

있습니다 List<Person>. List의 속성에서 를 가져와야합니다 Person.

예를 들어 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"));

다음과 같이 StreamAPI 로 이름 목록을 얻고 싶습니다.

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


API List로 속성을 얻으려면 어떻게 Stream해야합니까?

답변:


310

당신은 사용할 수 있습니다 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());

감사. 내가 가지고있는 많은 문자열 목록을 .map (Person :: getFriends);
NCNecros 2016 년

1
@NCNecros 입력 내용에 따라 다릅니다. 질문에 추가 한 코드에서 수행하려는 작업을 이해하지 못합니다.
Eran

@Eran 목록이 비어있는 경우를 처리합니까?
Joy

1
@NagabhushanSN foreach 루프, 전통적인 for 루프 또는 while 루프를 사용하여 반복 할 수 있지만 일부 루프를 사용해야합니다.
Eran

1
@PAA flatMap 전에 필터 호출 추가 :.filter(e->e.getFriends() != null)
Eran
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.