如何将一种列表类型的Optional转换为另一种列表

问题描述 投票:0回答:3

我有一个可选的

Optional<TypeA>
,我可以从中执行
map
函数并获得
Optional<List<TypeB>>

但我现在想将其映射到

Optional<List<TypeC>>
,然后
orElse()
它。所以输入伪代码

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

我知道如何使用

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

java mapping option-type
3个回答
1
投票

这个怎么样?

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

这基本上在

Stream
中创建了一个新的
.map
并使用它来将
TypeB
的所有元素转换为
TypeC
(假设
TypeB
有一个不带参数的方法
barReturnsTypeC
,该方法返回
TypeC
的实例) .


0
投票

您可以使用另一个

map
并编写方法将
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>
}

0
投票

首先,我会将

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

作为参数传递的供应商方法仅在以下情况下执行: 可选值不存在。

您还可以通过在

{?}
中使用
stream
来消除
map

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

注意:有关 orElse

orElseGet
之间差异的更多信息,请参阅
this

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.