美文网首页
Optional简单应用

Optional简单应用

作者: onlyHalfSoul | 来源:发表于2018-07-14 15:25 被阅读13次

最近看核心卷注意到了Java8新增的Optional类,对于经常遇到的空指针异常(NullPointException)有很好的解决效果,可以优雅的判空及替换空值。

Optional的作用

Optional<T>对象是一种包装器对象,可以包装 类型T,也可以没有包装任何对象。对于前一种情况,我们称为这种值存在。

Optional<T>类型被当作一种更安全的方式,用来代替T的引用,这种引用要么引用某个对象,要么为null。但是只有在正确使用方式下才会更安全。

Optional的正确使用

Optional的正确使用关键在于:
它在值不存在的情况下会产生一个可替代物,而只有值存在的情况下才会使用这个值。

下面举一个简单应用的例子:
例子user实例类

public class User {
    private int userId;
    private String userName;
    private int age;

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

在这我们做个测试类用Optional来包装user类,在user属性有值时显示那个值,为null时就用"unknown"代替

public class OptionalTest1 {
      public static String getUserName (User user) {
        return Optional.ofNullable(user).map(User -> User.getUserName()).orElse("Unknown");
    }

    public static void main(String[] args) {
        User user = new User();
        user.setUserId(1);
       // user.setUserName("tz");
        user.setAge(12);
        String userName = getUserName(user);
        System.out.println("userName = " + userName);
    }
    
}

当不注释userName赋值语句时,结果为:

userName = tz

注释掉userName赋值语句,则user实例中userName为null,则会被替换成unknown,结果为:

userName = Unknown

关键语句在于:

Optional.ofNullable(user).map(User -> User.getUserName()).orElse("Unknown");

这一使用也可以被用到包装map当中,

public static String getMapUserName(Map<String, String> map) {
        return Optional.ofNullable(map).map(map1 -> map1.get("userName")).orElse("unknowMapName");
    }

public static void main(String[] args) {

        Map<String,String> map = new HashMap<>();
        map.put("userId", "1");
        //map.put("userName","tz");
        String mapUserName = getMapUserName(map);
        System.out.println("MapUserName = " + mapUserName);
    }

空值替换结果为:

MapUserName = unknowMapName

创建Optional

创建Opltional对象有三种方法,

Optional.empty();

Optional.of(object);

Optional.ofNullable(object);

Optional.empty();
Optional.empty() 是创建一个空的Optional对象。

Optional.of(object);
Optional.of(object)方法是创建一个非空的包装对象,若object为null就会报出异常。

Optional.ofNullable(object)
Optional.ofNullable(object) 是一个兼容方法,若object不为null,它就和of方法一样,当object为空时,他就创建一个空的optional对象

可以看看ofNullable方法的源码:

public static <T> Optional<T> ofNullable(T value) {
        return value == null ? empty() : of(value);
    }

在此做了判断,value为null就调用empty方法,不为null就调用of方法,可见ofNullable是一个兼容性的方法。

Optional常用API

T orElse(T other)
产生这个Optional的值,或者在该Optional为空时,产生other。

T orElseGet(Supplier<? extends T> other)
产生这个Optional的值,或者Optional为空时,产生调用other的结果。

<X extends Throwable> T orElseThrow(Supplier<? extend X> exceptionSupplier)
产生这个Optional的值,或者这个Optional为空时,抛出调用exceptionSupplier的结果。

void ifPresent(Cusumer<? super T> consumer)
若该Optional不为空,那么就将它的值传递给Consumer。

<U> Optional<U> map(Function<? super T, extends U> mapper)
产生将该Optional的值传递给mapper后的结果,只有这个Optional不为空且结果不为null,否则产生一个空的Optional。

其中map方法非常常用。

相关文章

网友评论

      本文标题:Optional简单应用

      本文链接:https://www.haomeiwen.com/subject/eatspftx.html