更新列表1中的参数<;对象>;来自列表2<;对象>;通过使用Java8
我有两个对象列表帐户和工资,我需要迭代对象列表。如果id匹配,我需要更新account对象 我有list1和list2这两个对象是不同的对象类型。我们需要用list2对象(param)更新list1中的对象(param) 例子 我试过:更新列表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())要
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(..)));