作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有两个不同的相同对象列表,但属性不同,并且在这些对象中具有公共(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/
我是一名优秀的程序员,十分优秀!