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

Posted

技术标签:

【中文标题】如何使用 Java 8 Stream 从某些类属性中获取列表?【英文标题】:How can I get a List from some class properties with Java 8 Stream? 【发布时间】:2015-08-17 04:15:45 【问题描述】:

我有一个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】:

你可以使用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 这取决于输入的内容。我不明白您在添加到问题的代码中要做什么。 @Eran 列表为空的情况下会处理吗? @NagabhushanSN 您可以使用 foreach 循环、传统的 for 循环或 while 循环进行迭代,但您必须使用一些循环。 @PAA 在 flatMap 之前添加过滤器调用:.filter(e-&gt;e.getFriends() != null)

以上是关于如何使用 Java 8 Stream 从某些类属性中获取列表?的主要内容,如果未能解决你的问题,请参考以下文章

Java 8 : Stream API 练习

怎么在java 8的map中使用stream

怎么在java 8的map中使用stream

怎么在java 8的map中使用stream

jdk1.8 java.util.stream.Stream类 详解

具有任何匹配属性的对象的 JAVA 8 过滤器列表