向嵌套的 flatMap/stream 添加可选/空安全性

问题描述 投票:0回答:1

我无法使用流和 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 但最终创建了一个我不确定如何收集的流。有什么指点吗?

java java-stream optional-chaining
1个回答
1
投票

您实际上并不需要使用

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();
© www.soinside.com 2019 - 2024. All rights reserved.