如何用Java 8流替换嵌套循环

Pon*_*ons 4 java java-8 java-stream

我想将Java 8流用于以下实现。基本上,我想解析一个列表并形成另一个不同对象的列表。

输入 -Person pojos列表, 输出 -PersonInfo pojos列表

    List<Person> persons = new ArrayList<Person>();

    Person max = new Person();
    max.setName("Max");
    max.setAge(10);
    max.addAddress(new Address("Street1", "City1"));
    max.addAddress(new Address("Street2", "City2"));

    Person peter = new Person();
    peter.setName("Peter");
    peter.setAge(20);
    peter.addAddress(new Address("Street1", "City1"));
    peter.addAddress(new Address("Street2", "City2"));

    persons.add(max);
    persons.add(peter);

    System.out.println("Input: " + persons);

    List<PersonInfo> personInfos = new ArrayList<PersonInfo>();
    PersonInfo personInfo = null;
    for (Person person : persons) {
        for (Address addr : person.getCurrAndPrevAddrs()) {
            personInfo = new PersonInfo();
            personInfo.setName(person.getName());
            personInfo.setAge(person.getAge());
            personInfo.setAddrs(addr);              
            personInfos.add(personInfo);
        }
    }

    System.out.println("Output: " + personInfos.toString());
Run Code Online (Sandbox Code Playgroud)

样本输出输入:[最多10个[Street1 City1,Street2 City2]

,彼得20 [Street1 City1,Street2 City2]

输出:[Max 10 Street1 City1

,Max 10 Street2 City2

,彼得20街1 City1

,Peter 20 Street2 City2]

shm*_*sel 5

List<PersonInfo> personInfos = persons.stream().flatMap(person -> person.getCurrAndPrevAddrs().stream().map(addr -> {
        PersonInfo personInfo = new PersonInfo();
        personInfo.setName(person.getName());
        personInfo.setAge(person.getAge());
        personInfo.setAddrs(addr);              
        return personInfo;
})).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)