使用Java 8的可选项在列表处理中避免“空检查”
问题描述:
在Site
类中,我有两种实用方法。使用Java 8的可选项在列表处理中避免“空检查”
第一个,parseStub
,解析一个Site
成Master
如果没有发生错误;否则,返回null
。使用Optional
:
public static Optional<Master> parseStub(Site site) {
// do some parse work; return Optional.empty() if the parse fails.
}
第二种方法parseStubs
是解析的Site
列表成Master
列表。它重用parseStub
,并具有处理可能为空Optional<Master>
:
public static List<Master> parseStubs(List<Site> sites) {
return sites.stream()
.<Master>map(site -> Site.parseStub(site).orElse(null))
.filter(Objects::nonNull)
.collect(Collectors.toList());
}
注意,在上面的代码中,我再次介绍
null
。
我怎样才能避免null
(和filter(Objects::nonNull)
)持续使用Optional
?
答
这里有一种方法:
return sites.stream()
.map(Site::parseStub)
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList());
的Java 9:'flatMap(网站 - > Site.parseStub(网站).stream())收集(toList())' – Holger