使用 Java 8 的 Optional 在 List 处理中避免 "null-check"
Avoiding "null-check" in List processing using Optional of Java 8
在ClassSite
中,我有两个实用方法。
第一个,parseStub
,把一个Site
解析成一个Master
如果没有错误发生;否则,它 returns 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());
}
Note that in the code above, I introduced null
again.
How could I avoid null
(and filter(Objects::nonNull)
) using Optional
consistently?
这是一种方法:
return sites.stream()
.map(Site::parseStub)
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList());
在ClassSite
中,我有两个实用方法。
第一个,parseStub
,把一个Site
解析成一个Master
如果没有错误发生;否则,它 returns 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());
}
Note that in the code above, I introduced
null
again.
How could I avoidnull
(andfilter(Objects::nonNull)
) usingOptional
consistently?
这是一种方法:
return sites.stream()
.map(Site::parseStub)
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList());