我有一个可选的
Optional<TypeA>
,我可以从中执行 map
函数并获得 Optional<List<TypeB>>
。
但我现在想将其映射到
Optional<List<TypeC>>
,然后 orElse()
它。所以输入伪代码
Optional.ofNullable(fooReturnsTypeA()).map(TypeA::barReturnsListTypeB()).{?}.orElse(new ArrayList<TypeC>());
我知道如何使用
map
功能,但是用 Optional
处理 map
已经有一段时间了。所以,我可能只是盯着答案。有人可以帮我解决{?}
部分吗?
这个怎么样?
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
的实例) .
您可以使用另一个
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>
}
首先,我会将
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。