我使用Java 8,并且有两个对象,类似于:
人员班级:
public class Person {
private String id;
private String name;
public Person() {
}
public Person(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
'}';
}
}
Person1类别:
public class Person1 {
private String id;
private String name;
public Person1() {
}
public Person1(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person1{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
'}';
}
}
我有两个列表如下:
List<Person> persons= Arrays.asList(new Person("1","A"),new Person("2","B"));
List<Person1> persons1 = Arrays.asList(new Person1("3","C"),new Person1("1","F"));
现在我想使用流java 8循环两个列表并进行比较。如果列表人员中的任何对象等于person1,我将创建新列表并将其设置为新值。示例:如果Person1(“ 1”,“ F”)等于Person(“ 1”,“ A”),因为我使用 id 进行比较,则从Person1中获取名称设置为“人”。结果:Person(“ 1,” F“)并添加两个新列表。
我用于以下场合的代码:
for (Person person : persons) {
for (Person1 person1 : persons1 ) {
if (person1.getId().equals(person.getId())) {
person.setName(person1.getId());
break;
}
}
}
现在我想将其转换为具有新列表的流,如下所示:
List<Person> personList =
list.stream()
.filter (
person -> list1.stream()
.anyMatch(person1 -> person1.getId()== person.getId()))
.collect(Collectors.toList());
但是它仅过滤人。我想比较两个列表对象。如果具有相同的ID,我想将名称从person1中的对象设置为person。我知道我们可以在流java 8中使用map,但是我不能做到这一点。请帮助
答案 0 :(得分:5)
某些任务最好通过流完成,而其他任务则需要迭代。结合两种方法可以最好地完成许多任务。在此解决方案中,使用流来构造地图,然后使用迭代来更新匹配人员的姓名。您的解决方案以二次时间运行,而此解决方案以线性时间复杂度运行。
Map<String, String> idToNameMap = persons1.stream()
.collect(Collectors.toMap(Person1::getId, Person1::getName, (a, b) -> a));
for (Person person : persons) {
if (idToNameMap.containsKey(person.getId())) {
person.setName(idToNameMap.get(person.getId()));
}
}
答案 1 :(得分:1)
这不是最美丽的答案,但我想这会帮助您了解其工作原理。
List<Person> collect = persons.stream()
.filter(person -> persons1.stream().anyMatch(person1 -> person1.getId() == person.getId()))
.map(person -> {
Person1 getted = persons1.stream()
.filter(person1 -> person1.getId() == person.getId())
.findAny()
.orElseGet(null);
if (getted == null) throw new IllegalStateException("Should be Impossible");
person.setName(getted.getName());
return person;
})
.collect(Collectors.toList());