如何使用Java 8 Stream从某个类属性获取列表?

183

我有一个 List<Person>。我需要从Person的属性中获取一个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;
    }
}


如何使用Stream API获取属性的List

1个回答

430
你可以使用 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());

1
@NCNecros 这取决于输入是什么。我不理解你在问题中添加的代码想要做什么。 - Eran
@Eran 它会处理列表为空的情况吗? - Joy
@Joy 是的。如果输入列表为空,则输出列表也将为空。 - Eran
1
@NagabhushanSN,你可以使用foreach循环、传统的for循环或while循环进行迭代,但你必须使用其中某种循环。 - Eran
4
在使用flatMap之前添加一个过滤器调用:.filter(e->e.getFriends() != null) - Eran
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接