将两个指令写成一个流



我有两个Pearson列表(变量:FirstNameLastNameAllFirstName(。其中一个包含重复项(如果一个pearson有两个名字,那么在该列表中,每个名字将有两个条目,但姓氏将相同(,其中一个只有唯一值(listWithUniquePearsons(。第二个列表将通过对第一个列表进行迭代并将所有第一个名称放入对象列表中来创建。这是我用两个for写的。有没有办法把它写成stream

for (Pearson prs : listWithUniquePearsons) {
List<String> firstNames = new ArrayList<String>();
for (Pearson tempPerson : allPearsons) {
if (prs.getLastName().equals(tempPerson.getLastName())) {
firstNames.add(tempPerson.firstNames());
}
}
if (firstNames.size()>1) {
prs.setAllFirstNames(firstNames);
}
}
List<String> firstNames = listWithUniquePearsons
.stream()
.map(prs -> allPearsons.stream()
.filter(tempPerson -> prs.getLastName().equals(tempPerson.getLastName()))
.map(Person::getFirstName)
.collect(Collectors.toList());

您应该使用键lastName和值List<FirstName>构建一个映射,然后将其条目重新映射回Pearson类设置allFirstNames。这可以使用Java8流和收集器来完成。

让我们假设类Pearson实现如下:

import java.util.*;
public class Pearson {
private String firstName;
private String lastName;
private List<String> allFirstNames;

public Pearson(String first, String last) {
this.firstName = first;
this.lastName = last;
}

public Pearson(List<String> allFirst, String last) {
this.allFirstNames = allFirst;
this.lastName = last;
}

public String getFirstName() {return firstName; }
public String getLastName() {return lastName; }
public List<String> getAllFirstNames() {return allFirstNames; }
}

测试代码:

import java.util.*;
import java.util.stream.*;
public class Test {
public static void main(String[] args) {
List<Pearson> duplicates = Arrays.asList(
new Pearson("John", "Doe"),
new Pearson("William", "Doe"),
new Pearson("Edgar", "Poe"),
new Pearson("Allan", "Poe"),
new Pearson("Don", "King")
);
List<Pearson> uniques = duplicates.stream()
// map LastName -> List<FirstName>
.collect(Collectors.groupingBy(
Pearson::getLastName,
LinkedHashMap::new, // keep order of entries
Collectors.mapping(
Pearson::getFirstName,
Collectors.toList())
)).entrySet()
.stream()
.map(e -> new Pearson(e.getValue(), e.getKey()))
.collect(Collectors.toList());

uniques.forEach(u -> 
System.out.println(
String.join(" ", u.getAllFirstNames()) 
+ " " + u.getLastName()
));   
}
}

输出

John William Doe
Edgar Allan Poe
Don King

最新更新