gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:06:46 26 4
gpt4 key购买 nike

我有两个不同的相同对象列表,但属性不同,并且在这些对象中具有公共(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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com