使用Java 8的可选项在列表处理中避免“空检查”

问题描述:

Site类中,我有两种实用方法。使用Java 8的可选项在列表处理中避免“空检查”

第一个,parseStub,解析一个SiteMaster如果没有发生错误;否则,返回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

+3

的Java 9:'flatMap(网站 - > Site.parseStub(网站).stream())收集(toList())' – Holger

这里有一种方法:

return sites.stream() 
     .map(Site::parseStub) 
     .filter(Optional::isPresent) 
     .map(Optional::get) 
     .collect(Collectors.toList());