判断map是empty或者null 判断map是否为空和null_System


如果有这样一个嵌套对象User,嵌套了用户的地址Address,此时我们要获取地址中的邮政编码的值,通常我们会采用以下代码编写获取该值:


String postalCode = user.getAddress().getPostalCode().toUpperCase();


但在以上代码中,只要任意一个对象的值为NULL时,都可能导致NullPointerException异常。如果我们需要确保不触发异常,就需要在访问每一个值之前,对其进行NULL值检查:


if (user != null) {
    Address address = user.getAddress();
    if (address != null) {
        String postalCode  = address.getPostalCode();
        if (postalCode != null) {
                postalCode = postalCode .toUpperCase();
         }
    }
}


但这样的代码很容易就变得冗长了,一次取值三次判断NULL值。那有没有什么更简洁的代码可以优化此类操作呢?

在Java 8.0之后,新增了一个工具类Optional,Optional类封装了一些方法,包括判断NULL值方法,主要用来解决空指针异常(NullPointerException)问题,Optional结合函数编程可以优化以上多层NULL值判断代码。在优化以上代码之前,先让我们来了解下Optional类。

我们先通过一个简单判断一个字符串是否为空的例子来了解下Optional类:


Optional<String> str = Optional.of("halo");
if (str.isPresent()) {
    System.out.println(str.get());
}


以上代码中,Optional类中of方法用来实例化,isPresent方法则判断值是否为NULL。除此之外,我们再了解Optional工具类中的其他几个主要方法。

ofNullable

为指定的值创建一个Optional,如果指定的值为null,则返回一个空的Optional。可为空的Optional


// 下面创建了一个不包含任何值的Optional实例
// 输出Optional.empty
Optional empty = Optional.ofNullable(null);


map

如果有值,则对其执行调用mapping函数得到返回值。如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,否则返回空Optional。


Optional<String> username = Optional.of("test");
Optional<String> upperName = username.map((value) -> value.toUpperCase());


flatMap

如果有值,为其执行mapping函数返回Optional类型返回值,否则返回空Optional。flatMap与map(Funtion)方法类似,区别在于flatMap中的mapper返回值必须是Optional。调用结束时,flatMap不会对结果用Optional封装。


Optional<String> username = Optional.of("test");
upperName = username.flatMap((value) -> Optional.of(value.toUpperCase()));


orElse

如果有值则将其返回,否则返回指定的其它值。


Optional empty = Optional.ofNullable(null);
Optional<String> username = Optional.of("test");
System.out.println(empty.orElse("There is no value present!"));// 输出:There is no value present!
System.out.println(username.orElse("There is some value!"));  // 输出:test


通过以上例子,我们可以使用Optional类将最开始的复杂代码简化成以下一行代码:


String result = Optional.ofNullable(user)
.flatMap(u -> u.getAddress())
.map(a -> a.getPostalCode())
.orElse("");


上面的代码可通过方法引用(method references)做进一步精简:


String result = Optional.ofNullable(user)
  .flatMap(User::getAddress)
  .map(Address::getPostalCode)
  .orElse("");


http://weixin.qq.com/r/PTo3L1TEvgnBrRBM928v (二维码自动识别)