我有一个ID列表myIdList
和一个MapmyObjectMap
,它将ID与对应的对象Map<String,Object>
相关联。
我需要检查我的ID列表,对于每个ID --如果它存在于Map中,则将与它关联的对象添加到新的对象列表中,否则将该ID添加到缺失ID的列表中。
我可以使用一个简单的for each循环轻松地完成这一任务:
List<String> myIdList = Arrays.asList("a", "b", "c");
Map<String,Object> myObjectMap = new HashMap<>();
List<Object> objectList = new ArrayList<>();
List<String> missingObjIds = new ArrayList<>();
for(String id : myIdList) {
Object obj = myObjectMap.get(id);
if(obj == null) {
missingObjIds.add(id);
} else {
objectList.add(obj);
}
}
我想使用流API以一种不那么冗长的方式完成这项工作,但我不确定如何完成。
我尝试过对流进行分区,但得到的要么是一个包含2个ID列表的map(这需要再次遍历列表以检索Map的对象),要么是一个对象列表,其中所有缺失的对象都为空,而且无法获得缺失的ID。
我相信一定有办法的。有什么想法吗?
6条答案
按热度按时间qni6mghb1#
这不是很有效,但你可以做到。
输出:
3pmvbmvn2#
如果你真的想使用流,这里有一种方法。
数据
该方法
印刷品
但我希望你坚持你所拥有的,这很有意义,也很有效。
ntjbwcob3#
这是一个foreach情况。
zbsbpyhn4#
你可以在一个流中用分区/助手类来实现。但是,当2个流的实现是简洁的时候,为什么要使你的循环复杂呢?
lymgl2op5#
此逻辑可以在单个流语句中实现,并且通过使用自定义
Collector
(可以使用静态工厂方法Collector.of()
创建)没有 * 副作用 *。注意:我不会说这个解决方案比
for
-loop更简洁。但是它绝对是高性能和可维护的,并且客户端代码简洁。为此,我们需要定义一个自定义的累积类型,它应该由一个能够使用流元素并生成最终结果的 mutable object 表示。
因为我们需要获得两个不同的列表,所以流执行的结果应该是公开这两个列表的累积类型本身。
因此,简单地说,custom type,让我们称之为
Partitioner
,我们将使用它来执行可变归约,它应该 Package 两个列表。如果我们使它成为泛型,并添加一个Function
和Predicate
,这将涉及到将数据分区到它的属性,它将更加通用。而且为了方便,我们可以实现
Consumer
接口。这就是客户端代码中的stream-statement可能的样子:
生成
Collector()
示例的工厂方法partition()
可能如下所示:这就是包含实际逻辑的 * 自定义累加类型 * 的实现方式:
dm7nw8vv6#
简单点!!!