为了账号安全,请及时绑定邮箱和手机立即绑定

使用 java 8 从 list2<object> 更新 list1<object> 中的参数

使用 java 8 从 list2<object> 更新 list1<object> 中的参数

白衣染霜花 2022-12-07 15:09:38
我有两个对象帐户和薪水列表,我需要迭代对象列表。如果 ID 匹配,我需要更新帐户对象。我有 list1 和 list2 这两个对象是不同的对象类型。我们需要用 list2 object(param) 更新 list1 中的 object(param)。例子if(accounts !=null && salaries!=null) { // checking for nulls    for (Account obj1 : accounts) {// iterating objects        for (Salary obj2 : salaries) {            String id = ibj2.getId();            if (id.equals(obj1.getId())) {// id checks                  obj1.setxxxx(obj2.getxxxx());// set the value            }        }    }}  我试过了:list1.stream().flatMap(x -> list2 .stream() .filter(y -> x.getId().equals(y.getId())));
查看完整描述

3 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

您的flatMap(在评论中建议)将产生一个Stream<Salary>,这将不允许您修改相应的Account实例。


您可以创建一个Streamof Accounts 及其相应的并在其上Salary运行:forEachStream


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


查看完整回答
反对 回复 2022-12-07
?
繁星淼淼

TA贡献1775条经验 获得超11个赞

最后的操作,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()))

    );


查看完整回答
反对 回复 2022-12-07
?
狐的传说

TA贡献1804条经验 获得超3个赞

我总是建议创建一个地图,因为查找成本会降低并且它会变得更具可读性。


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

如果 Account Salary <-> Account 是一对一,您将分组更改为Collectors.toMap(..)


查看完整回答
反对 回复 2022-12-07
  • 3 回答
  • 0 关注
  • 171 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号