我有两份清单:
给定list1的大小与list2相同
我想迭代list2,如果list2的name2不为null,则更新list1的name1。
以下是使用旧java的代码:
for(Object1 obj1:list1) {
for(Object2 obj2:list2) {
if(obj1.getId1.equals(obj2.getId2)) {
obj1.setName1(obj2.getName2);
}
}
}
用java实现这一点的最佳方法是什么。util。流动
流的概念是它没有上下文。知道您在第一个流中的位置是上下文,您需要在第二个流中找到相应的项。
使用带有索引i
的普通for
循环。
for (int i=0; i < list2.size(); i++) {
Object2 item2 = list2.get(i);
if (list2.get(i).name != null) {
list1.get(i).name = item.name;
}
}
正如我在评论中提到的。如果id
是对象的uniqe标识符,那么Map
比List
更合适。
因此,您最好处理这样的映射(假设id是整数):
Map<Integer, Object1> obj1map;
您可以使用
obj1map = list1.stream().collect(toMap(Object1::getId, Function.identity()));
现在,您可以对第二个列表进行流式处理,并相应地更新地图:
list2
.stream()
.filter(o -> o.getName() != null) // remove null names
.filter(o -> obj1map.containsKey(o.getId())) // just to make sure
.forEach(o -> obj1map.get(o.getId()).setName(o.getName()));
为了清楚起见,我认为您的代码旨在执行以下操作:更新list1
中每个项目的名称,使其成为list2
中具有相同ID的任何项目的名称。如果list1
中的项目名称为空,似乎没有任何检查。
如果这是正确的,那么:
list2.forEach(obj2 -> list1.stream()
.filter(obj1 -> obj1.getId().equals(obj2.getId()))
.forEach(obj1 -> obj1.setName(obj2.getName()));
如果要检查名称是否为空,请在设置名称之前添加新筛选器:
.filter(Objects::isNull)
我在迭代一个对象内的列表时遇到了一个问题,该对象内嵌在另一个映射中。我的目标是迭代这个列表并生成一个映射 ,我希望使用streams和lamdas来实现这一点。 我在上面看到了,我需要通过迭代FolderBo中的elementList从elementBo创建一个带有map 的映射。folderBo本身就在Modelbo的地图内。
我有两个地图,键为整数,值为双倍。 我想创建第三个按键排序的映射,值将是两个映射的双精度列表。 地图1: Map2: 最终地图: 如上所述,如果一个地图中的一个键在另一个地图中丢失,则另一个地图的最终地图中的值应默认为0.00 我可以使用putAll方法将所有键放入第三张地图。但如何按照我的意愿设定这些值呢? 感谢阅读!
我有一个a类和B类的列表,没有重复的元素。“代码”属性在A类和B类中都是相同的。我想将它们转换为Map 最终映射的顺序应与列表1中的元素相同 ~A 更新:我将代码更新到下面,但它不是编译的。你知道怎么了吗?
我想知道,如何在Java8中使用流API迭代多级列表 根据Java8,我应该做如下的操作 我想要流利地做这件事(使用内部迭代)。任何解释都会很感激。
提示:如果已知失败的表达式在法律上为null/missing,可以使用myoptionalvar!mydefault指定默认值,或者使用<#If myoptionalvar??>when-present<#else>when-missing。(这些只覆盖表达式的最后一步;要覆盖整个表达式,请使用parenthessis:(myoptionvar.foo)!mydefault,(myoptionva
我有一个类具有以下签名: 我想将映射到在单个流中同时包含stringA和stringB的 或: 当然他们都不编译,但你明白了。 编辑: 示例: