在Java 8中使用“可选”删除嵌入式null检查

时间:2018-07-19 16:23:00

标签: java java-8 optional

我替换了以下代码:

if (status.getPlace() == null) {
    row.set("CountryCode", "Unknown");
    row.set("Country", "Unknown");
} else {
    if (status.getPlace().getCountryCode() == null) {
        row.set("CountryCode", "Unknown");
    } else {
        row.set("CountryCode", status.getPlace().getCountryCode());
    }
    if (status.getPlace().getCountry() == null) {
        row.set("Country", "Unknown");
    } else {
        row.set("Country", status.getPlace().getCountry());
    }
}

与此:

String countryCode = Optional.ofNullable(status.getPlace())
        .filter(p -> p.getCountryCode() != null)
        .map(Place::getCountryCode)
        .orElse("Unknown");
row.set("CountryCode", countryCode);

String country = Optional.ofNullable(status.getPlace())
        .filter(p -> p.getCountry() != null)
        .map(Place::getCountry)
        .orElse("Unknown");
row.set("Country", country);

它按预期工作,但我认为我可以做得更好。我仍在其中进行“空”检查。

.filter(p -> p.getCountryCode() != null)

有办法避免上述空检查吗?

2 个答案:

答案 0 :(得分:17)

您不需要空值检查-.filter(p -> p.getCountry() != null)。删除它,您的代码应该可以正常工作。

Optional.map()本身返回一个Optional实例。因此,无需应用空检查。

答案 1 :(得分:9)

您根本不需要执行$data = Item::with(['categories.categoryProperties','categories.categoryProperties.itemProperties'])->get(); 操作。如果对filterPlace::getCountryCode的调用返回了Place::getCountry,则返回一个空的可选值,这意味着将调用null方法来检索备用值。