比较2个集合并使用Java流API修改元素
有两组对象,例如用户—一组来自db(userSetDb),另一组—新创建的对象(userSet)。 我需要比较这两个集合,如果userSetDb包含userSet中的元素,则将userSetDb中用户的字段(例如电话号码)设置为userSet中的电话号码。(电话号码字段不包括在覆盖的等于方法中) 我无法完成流API表达式:比较2个集合并使用Java流API修改元素,java,java-stream,Java,Java Stream,有两组对象,例如用户—一组来自db(userSetDb),另一组—新创建的对象(userSet)。 我需要比较这两个集合,如果userSetDb包含userSet中的元素,则将userSetDb中用户的字段(例如电话号码)设置为userSet中的电话号码。(电话号码字段不包括在覆盖的等于方法中) 我无法完成流API表达式: userSetDb.stream().filter(u -> userSet.contains(u)) .map(u -> userSet.stream
userSetDb.stream().filter(u -> userSet.contains(u))
.map(u -> userSet.stream().filter(u1 -> u1.equals(u))....
我知道我可以先从userSetDb中删除类似的用户,然后从userSet中添加所有用户。但我想知道如何在另一个流中使用流来实现它。在流中使用流是一种好的做法吗?为了使用流API,首先需要将两个集中的相等用户关联起来。这意味着您需要从两个视为相等的集合中创建一对用户:
userSetDb.stream()
.map(udb -> Pair.create(udb, userSet.stream().filter(u -> u.equals(udb)).findFirst()))
这里我使用的是org.apache.commons.math3.util.Pair
,但是任何创建对象元组的类都可以工作
之后,仅对具有第二个元素的对进行筛选(对于两个集合中都存在的用户):
更新后,第一个元素与第二个元素的数据成对出现:
.forEach(pair -> pair.getFirst().setPhone(pair.getSecond().get().getPhone()));
把所有这些放在一起,你会得到如下结果:
userSetDb.stream()
.map(udb -> Pair.create(udb, userSet.stream().filter(u -> u.equals(udb)).findFirst()))
.filter(pair -> pair.getSecond().isPresent())
.forEach(pair -> pair.getFirst().setPhone(pair.getSecond().get().getPhone()));
或者正如@Eklavya在评论中提到的,您可以使用Map.Entry的实现,而不是库中的Pair
类:
userSetDb.stream()
.map(udb -> new AbstractMap.SimpleImmutableEntry<>(udb, userSet.stream().filter(u -> u.equals(udb)).findFirst()))
.filter(entry -> entry.getValue().isPresent())
.forEach(entry -> entry.getKey().setPhone(entry.getValue().get().getPhone()));
userSetDb.stream()
.map(udb->new AbstractMap.simpleimutableentry(udb,userSet.stream().filter(u->u.equals(udb)).findFirst())
.filter(条目->条目.getValue().isPresent())
.forEach(entry->entry.getKey().setPhone(entry.getValue().get().getPhone());
可以用来代替对
(额外库)
userSetDb.stream()
.map(udb -> new AbstractMap.SimpleImmutableEntry<>(udb, userSet.stream().filter(u -> u.equals(udb)).findFirst()))
.filter(entry -> entry.getValue().isPresent())
.forEach(entry -> entry.getKey().setPhone(entry.getValue().get().getPhone()));