繁体   English   中英

Java 可选 - 如何将一种类型的列表转换为另一种类型

[英]Java Optional - How to convert one type of list to another

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

但我想现在 map 到Optional<List<TypeC>>然后orElse()它。 所以输入伪代码

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

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

问候,

那这个呢?

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没有返回TypeC实例的参数)。

您可以使用另一个map和 write 方法将List<TypeB>转换为List<TypeC>

您的代码将如下所示:

    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>
}

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

作为参数传递的供应商方法仅在不存在 Optional 值时执行。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM