Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较2个集合并使用Java流API修改元素_Java_Java Stream - Fatal编程技术网

比较2个集合并使用Java流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

有两组对象,例如用户—一组来自db(userSetDb),另一组—新创建的对象(userSet)。 我需要比较这两个集合,如果userSetDb包含userSet中的元素,则将userSetDb中用户的字段(例如电话号码)设置为userSet中的电话号码。(电话号码字段不包括在覆盖的等于方法中)

我无法完成流API表达式:

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()));