我无法使用流和 flatMap 使我的方法空安全。
我的输入是
List<RequestSlot>
对象是这样嵌套的:
Request
OuterItem
List<InnerItem>
这正在努力展平列表并创建一个列表,但我不确定如何在此处添加选项以使此 null 对于每个映射/流步骤都是安全的。
final List<InnerItem> innerItem = request.stream()
.map(RequestSlot::getOuterItem)
.flatMap(outerItem -> outerItem.getInnerItem().stream()).collect(Collectors.toList());
我尝试过使用 Stream.ofNullable 但最终创建了一个我不确定如何收集的流。有什么指点吗?
您实际上并不需要使用
Optional
。在映射到可能为空的东西之后,到处都是 filter(Objects:nonNull)
。这会过滤掉所有空的东西
// assuming request itself is not null
final List<InnerItem> innerItem = request.stream()
.filter(Objects:nonNull) // list elements might be null
.map(RequestSlot::getOuterItem)
.filter(Objects:nonNull) // outer item might be null
.map(OuterItem::getInnerItem)
.filter(Objects:nonNull) // inner items list might be null
.flatMap(Collection::stream) // innerItemList -> innerItemList.stream()
.filter(Objects:nonNull) // inner item list might contain nulls
.toList();
如果您确实想使用
Stream.ofNullable
,请使用模式 flatMap(x -> Stream.ofNullable(x.getX()))
(其中 getX
可能返回 null)。
final List<InnerItem> innerItem = request.stream()
.filter(Objects:nonNull) // list elements might be null
.flatMap(requestSlot -> Stream.ofNullable(requestSlot.getOuterItem())) // outer item might be null
.flatMap(outerItem -> Stream.ofNullable(outerItem.getInnerItem())) // inner item list might be null
.flatMap(Collection::stream) // innerItemList -> innerItemList.stream()
.filter(Objects:nonNull) // inner item list might contain nulls
.toList();