向嵌套的 flatMap/stream 添加Options/null 安全性

N.A*_*N.A 1 java java-stream optional-chaining

我无法使用流和 flatMap 使我的方法空安全。

我的输入是List<RequestSlot>

对象是这样嵌套的:

        Request
                OuterItem
                        List<InnerItem>
Run Code Online (Sandbox Code Playgroud)

这正在努力展平列表并创建一个列表,但我不确定如何在此处添加选项以使此 null 对于每个映射/流步骤都是安全的。

  final List<InnerItem> innerItem = request.stream()
          .map(RequestSlot::getOuterItem)
          .flatMap(outerItem -> outerItem.getInnerItem().stream()).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

我尝试过使用 Stream.ofNullable 但最终创建了一个我不确定如何收集的流。有什么指点吗?

Swe*_*per 6

您实际上不需要使用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();
Run Code Online (Sandbox Code Playgroud)

如果您确实想使用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();
Run Code Online (Sandbox Code Playgroud)