我在使用Streams和Flat Map使我的方法为空安全时遇到了麻烦.

我的投入是List<RequestSlot>

并且对象按如下方式嵌套:

        Request
                OuterItem
                        List<InnerItem>

这是为了扁平化列表并创建一个列表,但我不确定如何在这里添加可选选项,以使该空值对于每个映射/流步骤都是安全的.

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

我try 使用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();

Java相关问答推荐

RDX触发ChoiceBox转换器(并按字符串值排序)

查找最大子数组的和

转换为Biggram

我的scala文件失败了Scala.g4 ANTLR语法

为什么一个java函数会返回一个作为参数传递给它的对象?

Intellij显示项目语言级别最高为12,尽管有java版本17 SDK

如何在带有Micronaut的YAML中使用包含特殊字符的字符串作为键

Kubernetes的Java客户端检索状态.处于终止状态的Pod的阶段';正在运行';

查找剩余的枚举

格式中的特定回录键-值对

使SLF4J在Android中登录到Logcat,在测试中登录到控制台(Gradle依赖问题)

在添加AdMob时无法为Google Play构建应用程序包:JVM垃圾收集器崩溃和JVM内存耗尽

A.ForEach与For(类型a:集合)

如何在ImageIO或十二只猴子中旋转TIFF CMYK图像?

在一行中检索字符分隔字符串的第n个值

我该如何为我的类编写getter和setter方法?

Java返回生成器的实现

Cucumber中第二个网页的类对象未初始化

SonarQube在合并升级到java17后对旧代码提出错误

ExecutorService:如果我向Executor提交了太多任务,会发生什么?