java - 如何从 Java 8 Streams 中的 forEach 循环获取列表输出

标签 java java-8 java-stream

我有两个不同的相同对象列表,但属性不同,并且在这些对象中具有公共(public)标识符。我想遍历第一个列表并从第二个列表(具有公共(public)属性)中获取相应的对象,然后将这些对象包装起来,最后使用 Java Streams 将该对象添加到列表中。

这是我举的例子。

private class Person {
        private String name;
        private boolean isSenior;

        private Person(String name, boolean isSenior) {
            this.name = name;
            this.isSenior = isSenior;
        }

        public String getName() {
            return name;
        }

        public boolean isSenior() {
            return isSenior;
        }

        @Override
        public String toString() {
            return name + ": " + isSenior;
        }
    }

    private class PersonWrapper {
        private Person jrPerson;
        private Person srPerson;

        private PersonWrapper(Person jrPerson, Person srPerson) {
            this.jrPerson = jrPerson;
            this.srPerson = srPerson;
        }

        public Person getJrPerson() {
            return jrPerson;
        }

        public Person getSrPerson() {
            return srPerson;
        }

        @Override
        public String toString() {
            return jrPerson.toString() + "-" + srPerson.toString();
        }
    }

现在,在主类中,我将创建两个这样的列表实例

List<Person> jrPersons = new ArrayList<>();
List<Person> srPersons = new ArrayList<>();

并按以下方式添加对象

jrList.add(new Person("John", false));
jrList.add(new Person("Paul", false));
jrList.add(new Person("Mike", false));

seniorList.add(new Person("John", true));
seniorList.add(new Person("Paul", true));
seniorList.add(new Person("Mike", true));

现在,我想遍历 jrList 并在 srList(同名)中找到对应的 Person 对象。然后我会将这些对象包装为 PersonWrapper 并将该对象包装到列表中。

到目前为止,这就是我一直在做的事情

List<PersonWrapper> wrapperList = new ArrayList<>();

jrList.forEach(jr -> seniorList.stream().filter(sr -> jr.getName().equals(sr.getName())).map(sr -> new PersonWrapper(jr, sr)).collect(Collectors.toList()));

现在,我想知道如何将 Collectors.toList() 替换为 wrapperList 或者 Collectors.toList()< 的输出如何 被添加到 wrapperList

请帮助我实现这一目标。

最佳答案

而不是使用 forEach从一开始就使用流:

List<PersonWrapper> wrapperList = jrList.stream()
    .flatMap(jr -> seniorList.stream()
         .filter(sr -> jr.getName().equals(sr.getName()))
         .map(sr -> new PersonWrapper(jr, sr))
    )
    .collect(Collectors.toList());

通过使用 flatMap您可以扁平化流 ( Stream<Stream<PersonWrapper>> ) 为单个流 ( Stream<PersonWrapper> )

如果不能实例化wrapperList自己或真的需要附加到它。您可以将上面的代码片段更改为以下内容:

List<PersonWrapper> wrapperList = new ArrayList<>();

jrList.stream()
    .flatMap(jr -> seniorList.stream()
         .filter(sr -> jr.getName().equals(sr.getName()))
         .map(sr -> new PersonWrapper(jr, sr))
    )
    .forEach(wrapperList::add);

关于java - 如何从 Java 8 Streams 中的 forEach 循环获取列表输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50618049/

相关文章:

java - IntelliJ 不突出显示任何内容

java - 是否有正确的方法来关闭在 java stream api 中打开的资源(对于每个元素)?

Peek 中的 Java 8 条件逻辑?

java - 将字节数组转换为 List<?使用 java8 扩展 Document> (org.bson.Document)

Java 8 流获取无法调用原始类型 void 上的映射

java - 并行流概念

java - 刚刚将我的hadoop集群升级到2.4.1,并且一切正常

java - 如何在打开新框架时关闭上一个框架

java - 使用java : list. item(i).getFirstChild()遍历xml DOM

Java 8流并行reduce BiFunction累加器