Java 8流 - 考虑到NULL,将UUID列表转换为String列表。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 8流 - 考虑到NULL,将UUID列表转换为String列表。相关的知识,希望对你有一定的参考价值。

  • 我想设置一个 List<String> 到外地 selectedResources.
  • getProtectionSet() 返回一个 List<ProtectionSet>
  • 保护集有一个字段 List<UUID> resourceIds 而这 List<UUID> = List<String> 我想保存在selectedResources中。
  • getProtectionSet() 是一个列表,但我想从第一个元素中获取值。
  • 我不希望有NPE异常
  • 当任何一个列表为空时,再继续下去就没有意义了。
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异常?

答案

虽然你不应该真正面对一个 NullPointerException 以你目前的代码,仍然有可能得到一个 NoSuchElementException 用于进行 get 关于 Optional 而不确认是否存在。

你应该使用 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>

以上是关于Java 8流 - 考虑到NULL,将UUID列表转换为String列表。的主要内容,如果未能解决你的问题,请参考以下文章

将对象列表转换为映射Java 8流

Java 8 流映射到按值排序的键列表

通过流将带有列表的列表对象转换为Java 8中的映射[重复]

Java 8 流:列表到按 [重复] 分组的平面地图

Java 8 流:迭代列表映射

使用 Java 流检查 ArrayList 内容