猿问

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

我有两个对象帐户和薪水列表,我需要迭代对象列表。如果 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())));


白衣染霜花
浏览 172回答 3
3回答

慕的地8271018

您的flatMap(在评论中建议)将产生一个Stream<Salary>,这将不允许您修改相应的Account实例。您可以创建一个Streamof Accounts 及其相应的并在其上Salary运行:forEachStreamaccounts.stream()&nbsp; &nbsp; &nbsp; &nbsp; .flatMap(a->salaries.stream()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .filter(s -> s.getID().equals(a.getID())&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .map(s -> new SimpleEntry<Account,Salary)(a,s)))&nbsp; &nbsp; &nbsp; &nbsp; .forEach(e -> e.getKey().setxxxx(e.getValue().getxxxx()));

繁星淼淼

最后的操作,obj1.setxxxx(obj2.getxxxx());需要同时拥有obj1和obj2。指示从两个列表流式传输的项目list1.stream()&nbsp; &nbsp; .forEach(obj1 ->&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; list2.stream()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .filter(obj2 -> obj1.getId().equals(obj2.getId()))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .findFirst()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .ifPresent(obj2 -> obj1.setxxxx(obj2.getxxxx()))&nbsp; &nbsp; );

狐的传说

我总是建议创建一个地图,因为查找成本会降低并且它会变得更具可读性。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(..)
随时随地看视频慕课网APP

相关分类

Java
我要回答