[英]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>());
注意:有关orElse
和orElseGet
之间区别的更多信息,请参阅 此。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.