Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.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
更新列表1中的参数<;对象>;来自列表2<;对象>;通过使用Java8_Java_Lambda_Java Stream - Fatal编程技术网

更新列表1中的参数<;对象>;来自列表2<;对象>;通过使用Java8

更新列表1中的参数<;对象>;来自列表2<;对象>;通过使用Java8,java,lambda,java-stream,Java,Lambda,Java Stream,我有两个对象列表帐户和工资,我需要迭代对象列表。如果id匹配,我需要更新account对象 我有list1和list2这两个对象是不同的对象类型。我们需要用list2对象(param)更新list1中的对象(param) 例子 我试过: list1.stream().flatMap(x -> list2 .stream() .filter(y -> x.getId().equals(y.getId()))); 最后一个操作,obj1.setxxxx(obj2.getxxxx())要

我有两个对象列表帐户和工资,我需要迭代对象列表。如果id匹配,我需要更新account对象

我有list1和list2这两个对象是不同的对象类型。我们需要用list2对象(param)更新list1中的对象(param)

例子 我试过:

list1.stream().flatMap(x -> list2 .stream() .filter(y -> x.getId().equals(y.getId())));

最后一个操作,
obj1.setxxxx(obj2.getxxxx())要求同时具有
obj1
obj2
。指示从两个列表流式传输的项目

list1.stream()
    .forEach(obj1 -> 
        list2.stream()
            .filter(obj2 -> obj1.getId().equals(obj2.getId()))
            .findFirst()
            .ifPresent(obj2 -> obj1.setxxxx(obj2.getxxxx()))
    );
您的
flatMap
(注释中建议)将生成
,这将不允许您修改相应的
帐户
实例

您可以创建一个
帐户
及其相应的
工资
,并在该
流上运行
forEach

accounts.stream()
        .flatMap(a->salaries.stream()
                            .filter(s -> s.getID().equals(a.getID())
                            .map(s -> new SimpleEntry<Account,Salary)(a,s)))
        .forEach(e -> e.getKey().setxxxx(e.getValue().getxxxx()));
accounts.stream()
.flatMap(a->salarys.stream()
.filter(s->s.getID().equals(a.getID())
.map->新建SimpleEntry e.getKey().setxxxx(e.getValue().getxxxx());

我总是建议创建一个映射,因为查找成本会降低,而且它会变得更可读

Map<String, List<Salary>> salaryById = salaries.stream().collect(Collectors.groupingBy(Salary::getId));
accounts.forEach(a -> CollectionUtils.emptyIfNull(salaryById.get(a.getId())).forEach(s -> s.setxxxx(..)));
Map salaryById=salarys.stream().collect(Collectors.groupingBy(Salary::getId));
accounts.forEach(a->CollectionUtils.emptyIfNull(salaryById.get(a.getId())).forEach(s->s.setxxxx(…));

如果账户工资账户是一对一的,您可以将分组更改为
Collectors.toMap(..)

//我已经尝试了这个list1.stream().flatMap(x->list2.stream().filter(y->x.getId().equals(y.getId()));在我看来,没有理由将此迭代代码重写为java 8 streams,因为它不会给您带来任何性能好处,只会使可读性变得更复杂。@GolovPavel,也就是说,除非列表很大,在这种情况下,并行流将受益here@SharonBen Asher,好吧,如果名单很大,可能是useful@GolovPavel,有一个看看我的答案,告诉我可读性如何
Map<String, List<Salary>> salaryById = salaries.stream().collect(Collectors.groupingBy(Salary::getId));
accounts.forEach(a -> CollectionUtils.emptyIfNull(salaryById.get(a.getId())).forEach(s -> s.setxxxx(..)));