Google Guava之Optional<T>

作者: _aoj | 来源:发表于2016-07-01 14:39 被阅读4050次

    如何避免代码中粗鲁的null判断 ,即Option<T>的价值?

    使用Optional<T>除了简化粗鲁的if(null == object)、降低函数的复杂度、增加可读性之外,它是一种傻瓜式的防护,Optional<T>引导编码人员主动的思考引用为null的情况。

    准备工作

    官方仓库:https://github.com/google/guava

    在线wiki:https://github.com/google/guava/wiki

    Optional<T>简介

    com.google.common.base.Optional允许接受可能为null的T类型的引用

    1.Optional<T> 创建实例
    创建实例 描述
    Optional.of(T) 若引用为null则快速失败 java.lang.NullPointerException
    Optional.absent() 创建引用缺失的Optional实例
    Optional.fromNullable(T) 引用为null则表示缺失

    2.Optional<T>查询引用
    常用方法 描述
    boolean isPresent() 包含的引用非null的(引用存在),返回true
    T get() 包含的引用缺失,则抛出java.lang.IllegalStateException
    T or(T) 包含的引用缺失,返回指定的值
    T orNull 包含的引用缺失,返回null
    Set<T> asSet() 如果引用存在,返回只有单一元素的集合;引用缺失,返回空集合。 |
    <V> Optional<V> transform() 引用存在,则它被转换给定的功能;否则absent()被返回。 |
    <T> Iterable<T> presentInstances(Iterable<? extends Optional<? extends T>> optionals) 将参数optionals中为null的optional剔除,同时返回值对象的Iterable |
    代码示例

    1.基本用法

    Optional<Integer> possible = Optional.fromNullable(5);  //创建允许null值的Optional
    possible.isPresent();
    possible.get();         // 5
    possible.or(3));            // 5
    possible.orNull();      // 5
    possible.asSet();       // [5]
    
    

    2.abstract <V> Optional<V> transform(Function<? super T,V> function)用法介绍

    根据Optional中的实例进行功能转化,如下例子可以看出:当创建的Optional中的reference为100的时候,执行该段代码会进入到apply函数,根据reference进行功能函数切换最终返回一个新的Optional<Boolean>对象;当reference为null的时候,在Optional.fromNullable创建的时候直接创建的Optional.<T>absent()执行get方法就会跑出异常java.lang.IllegalStateException: Optional.get() cannot be called on an absent value

    Optional<Integer> possible = Optional.fromNullable(100);
    Optional<Boolean> t = possible.transform(new Function<Integer, Boolean>() {
         public Boolean apply(Integer input) {
                    return 100 != input ? Boolean.TRUE : Boolean.FALSE;
         }
    });
    t.get();  // false
    
    

    3.static <T> Iterable<T> presentInstances(Iterable<? extends Optional<? extends T>> optionals)如果实例存在,则它被转换给定的功能;否则absent()被返回。

    List<Optional<Integer>> list = new ArrayList<Optional<Integer>>();
    for (int index = 10; index > 0; --index) {
        Integer t;
        if (0 == index % 2) {
            t = index;
        } else {
            t = null;
        }
        list.add(Optional.<Integer>fromNullable(t));
    }
    Iterable<Integer> it = Optional.presentInstances(list);
    it.forEach(new Consumer<Integer>() {
        public void accept(Integer integer) {
            System.err.println(integer);
        }
    });
    
    //输出结果
    //10
    //8
    //6
    //4
    //2
    

    相关文章

      网友评论

        本文标题:Google Guava之Optional<T>

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