美文网首页
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