Java Stream:嵌套流查找多个列表抛出NPE



我在Java 7中有以下代码:

List<Integer> idMappers= new ArrayList<>();
//getting information from a Map<String, List<String>>
List<String> ids= idDataStore.lookupId(id); 
for (int i = 0; i < ids.size(); i++) {
//getting information from a Map<String, List<Integer>>
List<Integer> mappers= idDataStore.lookupMappers(ids.get(i));
if (mappers!= null) {
for (int j = 0; j < x.size(); j++) {
idMappers.add(mappers.get(j));
}
}
}

我正在尝试将其更改为流

List<Integer> idMappers= new ArrayList<>();
idDataStore.lookupIdMappings(id).forEach(id-> {
idDataStore.lookupSegments(id).forEach(mapper->{
idSegments.add(segment);
});
});

我的问题是idDataStore.lookupSegments(id)有时会抛出 null,所以我的流中断了。如何在流中进行空检查?

首先,在lambda中使用的变量(id(不能与方法相同范围内的变量同名。

Lambda 表达式的参数 ID 无法重新声明封闭作用域中定义的另一个局部变量。

我看到您使用嵌套进行循环,为什么不使用Stream::flatMap

idDataStore.lookupIdMappings(id).stream()
.map(i -> idDataStore.lookupSegments(id))
.filter(Objects::nonNull)
.flatMap(List::stream)
.collect(Collectors.toList());

只需将idDataStore.lookupSegments(id).stream().filter(Objects::notNull)添加到嵌套循环中即可。

但是,您有的是副作用(请参阅副作用部分(,不建议以填充idMappers列表的方式。让我尝试使用flatMap进行转换

List<Integer> idMappers = idDataStore.lookupIdMappings(id)
.stream() // stream of LookupId's
.flatMap(idMapping -> idDataStore
.lookupSegments(id)
.stream()
.filter(Objects::notNull)
// get stream of corresponding lookupSegments
// and filter out all nulls
)
.collect(Collectors.toList());

我希望这有所帮助。

最新更新