【问题标题】:Java Optional - How to convert one type of list to anotherJava 可选 - 如何将一种类型的列表转换为另一种
【发布时间】:2021-11-12 21:13:16
【问题描述】:

我有一个可选的Optional<TypeA>,我可以从中执行map 函数并获取Optional<List<TypeB>>

但我现在想将其映射到 Optional<List<TypeC>>,然后再映射到 orElse()。所以输入伪代码

Optional.ofNullable(fooReturnsTypeA()).map(TypeA::barReturnsListTypeB()).{?}.orElse(new ArrayList<TypeC>());

我知道如何使用map 函数,但是用map 处理Optional 已经有一段时间了。所以,我可能只是盯着答案。有人可以帮我处理{?} 部分吗?

问候,

【问题讨论】:

    标签: java stream mapping optional


    【解决方案1】:

    这个怎么样?

    Optional.ofNullable(fooReturnsTypeA())
        .map(TypeA::barReturnsListTypeB())
        .map(typeBList->typeBList
            .stream()
            .map(TypeB::barReturnsTypeC)
            .collect(Collectors.toList())
        )
        .orElse(new ArrayList<TypeC>())
    

    这基本上是在.map 中创建一个新的Stream 并使用它将TypeB 的所有元素转换为TypeC(假设TypeB 有一个方法barReturnsTypeC 没有返回@987654328 实例的参数@)。

    【讨论】:

      【解决方案2】:

      您可以使用另一个map 和 write 方法将List&lt;TypeB&gt; 转换为List&lt;TypeC&gt;

      您的代码将如下所示:

          Optional.ofNullable(fooReturnsTypeA())
          .map(TypeA::barReturnsListTypeB())
          .map(this::convert)
          .orElse(new ArrayList<TypeC>());
      

      以及你的转换方法:

          private List<TypeC> convert(List<TypeB> list) {
          // conversion logic
          // return List<TypeC>
      }
      

      【讨论】:

        【解决方案3】:

        首先,我会将orElse 替换为orElseGet。根据您的代码,使用 orElseGet 而不是 orElse 可以提高您的性能。即使Optional 不为空,也会评估orElse 的参数。另一方面,orElseGet 的参数仅在 Optional 为空时进行评估。在您的特定情况下,您可能会实例化不必要的ArrayLists。来自 Javadoc:

        作为参数传递的供应商方法仅在 不存在可选值。

        您还可以通过在map 中使用stream 来关闭{?}

        Optional.ofNullable(fooReturnsTypeA())
            .map(typeA -> typeA.barReturnsListTypeB().stream()
                    .map(TypeB::barReturnsTypeC).collect(Collectors.toList()))
            .orElseGet(() -> new ArrayList<TypeC>());
        

        注意:有关orElseorElseGet 之间区别的更多信息,请参阅this

        【讨论】:

          猜你喜欢
          • 2023-01-04
          • 1970-01-01
          • 1970-01-01
          • 2011-01-24
          • 2012-03-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多