首页 > 解决方案 > Java 8 流 - 考虑 NULL 将 UUID 列表转换为字符串列表

问题描述

private Mono<Protection> addProt(Protection protection) {
...
...
    MyClass.builder()
    .fieldA(...)
    .fieldB(...)
    .selectedResources(  //-->List<String> is expected
                       protection.getProtectionSet().stream() //List<ProtectionSet>
                                  .filter(Objects::nonNull)
                                  .findFirst()
                                  .map(ProtectionSet::getResourceIds) //List<UUID>
                                  .get()
                                  .map(UUID::toString)
                                  .orElse(null))
    .fieldD(...)

如何编写我的流以避免 NPE 异常?

标签: javajava-8java-streamoptional

解决方案


尽管您不应该真正面对 aNullPointerException当前代码,但仍有可能在不确认存在的情况下NoSuchElementException执行 a 。getOptional

您应该orElse提前使用几个阶段,因为我理解问题,以便您map找到第一个元素并仅流式传输其元素(如果可用):

protection.getProtectionSet().stream() //List<ProtectionSet>
        .filter(Objects::nonNull)
        .findFirst() // first 'ProtectionSet'
        .map(p -> p.getResourceIds()) // Optional<List<UUID>> from that 
        .orElse(Collections.emptyList()) // here if no such element is found
        .stream()
        .map(UUID::toString) // map in later stages
        .collect(Collectors.toList()) // collect to List<String>

推荐阅读