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

NCN*_*ros 108 java collections java-8 java-stream

我有一个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"));
Run Code Online (Sandbox Code Playgroud)

我想获得StreamAPI 的名称列表,如下所示:

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

#David
#Joe
#Michel
#Barak
Run Code Online (Sandbox Code Playgroud)

此代码不起作用:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)


如何获得API List的属性Stream

Era*_*ran 261

这是基本的,您使用map:

List<String> names = 
    personList.stream()
              .map(Person::getName)
              .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

编辑:

为了组合好友名称列表,您需要使用flatMap:

List<String> friendNames = 
    personList.stream()
              .flatMap(e->e.getFriends().stream())
              .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

  • @PAA 在 flatMap 之前添加一个过滤器调用:`.filter(e-&gt;e.getFriends() != null)` (3认同)