`
chenjingbo
  • 浏览: 456436 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Guava总结1-Optional 介绍

 
阅读更多

       Guava作为一个牛逼的通用工具类.提供了很多灰常不错的封装方法.可以让代码变得非常优美.一般来说,就是谁用谁知道了..

      

       按照wiki上的顺序,第一个是Optional,主要的功能是解决null值表达寓意的问题.还可以避免null值经常造成的NullPointerException..个人的感觉是,使用增加了一点代码量,提高了一些代码的自有缺陷.

       Optional 是一个抽象类,对应的实现有两个,



 其中,Absent对应就是空值时候的Optional,而Present是有非空值的Optional..

      具体的方法如下

/**
     * 获取一个空值(null值)的Optional对象
     *  对应会返回Absent对象
     */
    public static <T> Optional<T> absent();

    /**
     * 获取一个非null的Optional对象
     * 对应会返回Present对象
     */
    public static <T> Optional<T> of(T reference);

    /**
     * 静态方法,调用方无需关心nullableReference是Null还是非Null.
     * 如果是null则转换成Absent对象,如果非null则转换为Present对象
     */
    public static <T> Optional<T> fromNullable(T nullableReference);

    /**
     * 判断该Option是否有值
     */
    public abstract boolean isPresent();

    /**
     * 有值的时候返回对应的值,如果为空值对象(Absent对象),则抛出IllegalStateException异常
     */
    public abstract T get();

    /**
     * 做一个值判断,规则是,
     * 如果是有值对象(Present对象),则不管defalutValue是什么,自动返回对应的值.
     * 如果是空值对象(Absent对象),则返回defaultValue对应的值,defaultValue如果是null,也返回null
     */
    public abstract T or(T defaultValue);

    /**
     * Returns this {@code Optional} if it has a value present; {@code secondChoice}
     * 该方法从来不用.不多解释(保留英文注释)
     * otherwise.
     */
    public abstract Optional<T> or(Optional<? extends T> secondChoice);

    /**
     * Returns the contained instance if it is present; {@code supplier.get()} otherwise. If the
     * supplier returns {@code null}, a {@link NullPointerException} is thrown.
     * 该方法从来不用.不多解释(保留英文注释)
     *
     * @throws NullPointerException if the supplier returns {@code null}
     */
    @Beta
    public abstract T or(Supplier<? extends T> supplier);

    /**
     * 这个就是 or方法传入一个Null的效果.
     * 如果是有值对象(Present对象),则返回对应的值.
     * 如果是空值对象(Absent对象),则返回null
     */
    public abstract T orNull();

    /**
     * 该方法一直没搞清楚是干嘛用的..就是把Optional自动转换成一个Set.
     * 如果是有值对象(Present对象),则返回只有一个值的Set.
     * 如果是空值对象(Absent对象),则返回一个空的Set.
     * 这个方法有应用场景吗??
     */
    public abstract Set<T> asSet();

    /**
     * 安全的equals比较.不需要担心空指针问题哦
     * 如果是有值对象(Present对象),则调用对应值的equals方法.
     * 如果是空值对象(Absent对象),则
     */
    @Override
    public abstract boolean equals(Object object);

    /**
     * Returns the value of each present instance from the supplied {@code optionals}, in order,
     * skipping over occurrences of {@link Optional#absent}. Iterators are unmodifiable and are
     * evaluated lazily.
     * 自动过滤空值对象,转换成新的Iterable
     */
    public static <T> Iterable<T> presentInstances(final Iterable<? extends Optional<? extends T>> optionals);

 

  大概会用到的方法如下

 //present
        Optional<Integer> possible = Optional.<Integer>of(5);
        System.out.println(possible.isPresent());//true
        System.out.println(possible.get()); // 5
        System.out.println(possible.or(-1));//5
        System.out.println(possible.orNull());//5

        //absent
        Optional<Integer> absentValue = Optional.<Integer>absent();
        System.out.println(absentValue.isPresent());//false
        try{
            System.out.println(absentValue.get());//IllegalStateException
        } catch (Exception e){
            e.printStackTrace();
        }
        System.out.println(absentValue.or(-1)); // -1
        System.out.println(absentValue.orNull()); // null
//
//
        //用static方法,自动帮我们创建Optional对象.
        Optional<Integer> nullValue = Optional.<Integer>fromNullable(null);
        System.out.println(nullValue.isPresent());//false
        try{
            System.out.println(nullValue.get());//IllegalStateException
        } catch (Exception e){
            e.printStackTrace();
        }
        System.out.println(nullValue.or(-1)); // -1
        System.out.println(nullValue.orNull()); // null

 

 

写道
相信用过scala的Option的同学都知道,这个设计有多么的优美。

 

  • 大小: 19 KB
分享到:
评论
2 楼 chenjingbo 2013-12-16  
jianchen 写道
Optional<Integer> absentValue = Optional.<Integer>absent(); 
System.out.println(absentValue.isPresent());//true 

应该是false

谢谢指正,已经修正
1 楼 jianchen 2013-12-16  
Optional<Integer> absentValue = Optional.<Integer>absent(); 
System.out.println(absentValue.isPresent());//true 

应该是false

相关推荐

    guava-30.0-jre-API文档-中文版.zip

    赠送jar包:guava-30.0-jre.jar; 赠送原API文档:guava-30.0-jre-javadoc.jar; 赠送源代码:guava-30.0-jre-sources.jar; 赠送Maven依赖信息文件:guava-30.0-jre.pom; 包含翻译后的API文档:guava-30.0-jre-...

    guava-25.0-jre-API文档-中文版.zip

    赠送jar包:guava-25.0-jre.jar; 赠送原API文档:guava-25.0-jre-javadoc.jar; 赠送源代码:guava-25.0-jre-sources.jar; 赠送Maven依赖信息文件:guava-25.0-jre.pom; 包含翻译后的API文档:guava-25.0-jre-...

    guava-27.0.1-jre-API文档-中文版.zip

    赠送jar包:guava-27.0.1-jre.jar; 赠送原API文档:guava-27.0.1-jre-javadoc.jar; 赠送源代码:guava-27.0.1-jre-sources.jar; 赠送Maven依赖信息文件:guava-27.0.1-jre.pom; 包含翻译后的API文档:guava-...

    guava-28.2-jre-API文档-中文版.zip

    赠送jar包:guava-28.2-jre.jar; 赠送原API文档:guava-28.2-jre-javadoc.jar; 赠送源代码:guava-28.2-jre-sources.jar; 赠送Maven依赖信息文件:guava-28.2-jre.pom; 包含翻译后的API文档:guava-28.2-jre-...

    guava-29.0-jre-API文档-中英对照版.zip

    赠送jar包:guava-29.0-jre.jar; 赠送原API文档:guava-29.0-jre-javadoc.jar; 赠送源代码:guava-29.0-jre-sources.jar; 赠送Maven依赖信息文件:guava-29.0-jre.pom; 包含翻译后的API文档:guava-29.0-jre-...

    guava-20.0-API文档-中文版.zip

    赠送jar包:guava-20.0.jar; 赠送原API文档:guava-20.0-javadoc.jar; 赠送源代码:guava-20.0-sources.jar; 赠送Maven依赖信息文件:guava-20.0.pom; 包含翻译后的API文档:guava-20.0-javadoc-API文档-中文...

    guava-28.2-jre-API文档-中英对照版.zip

    赠送jar包:guava-28.2-jre.jar; 赠送原API文档:guava-28.2-jre-javadoc.jar; 赠送源代码:guava-28.2-jre-sources.jar; 赠送Maven依赖信息文件:guava-28.2-jre.pom; 包含翻译后的API文档:guava-28.2-jre-...

    guava-26.0-android-API文档-中英对照版.zip

    赠送jar包:guava-26.0-android.jar; 赠送原API文档:guava-26.0-android-javadoc.jar; 赠送源代码:guava-26.0-android-sources.jar; 赠送Maven依赖信息文件:guava-26.0-android.pom; 包含翻译后的API文档:...

    guava-26.0-android-API文档-中文版.zip

    赠送jar包:guava-26.0-android.jar; 赠送原API文档:guava-26.0-android-javadoc.jar; 赠送源代码:guava-26.0-android-sources.jar; 赠送Maven依赖信息文件:guava-26.0-android.pom; 包含翻译后的API文档:...

    guava-24.1-jre-API文档-中英对照版.zip

    赠送jar包:guava-24.1-jre.jar; 赠送原API文档:guava-24.1-jre-javadoc.jar; 赠送源代码:guava-24.1-jre-sources.jar; 赠送Maven依赖信息文件:guava-24.1-jre.pom; 包含翻译后的API文档:guava-24.1-jre-...

    guava-23.0-API文档-中文版.zip

    赠送jar包:guava-23.0.jar; 赠送原API文档:guava-23.0-javadoc.jar; 赠送源代码:guava-23.0-sources.jar; 赠送Maven依赖信息文件:guava-23.0.pom; 包含翻译后的API文档:guava-23.0-javadoc-API文档-中文...

    guava-23.6-android

    guava-23.6-android guava 版本23.6的 jar 包

    guava-27.1-jre.jar

    guava-27.1-jre

    guava-27.0-jre.jar

    guava-27.0-jre.jar

    guava-18.0-API文档-中文版.zip

    赠送jar包:guava-18.0.jar; 赠送原API文档:guava-18.0-javadoc.jar; 赠送源代码:guava-18.0-sources.jar; 包含翻译后的API文档:guava-18.0-javadoc-API文档-中文(简体)版.zip 对应Maven信息:groupId:...

    guava-28.0-android-API文档-中文版.zip

    赠送jar包:guava-28.0-android.jar; 赠送原API文档:guava-28.0-android-javadoc.jar; 赠送源代码:guava-28.0-android-sources.jar; 赠送Maven依赖信息文件:guava-28.0-android.pom; 包含翻译后的API文档:...

    guava-31.1-jre.jar

    guava

    最新版 guava-30.1-jre.jar

    最新版 guava-30.1-jre.jar

    guava-20.0-API文档-中英对照版.zip

    赠送jar包:guava-20.0.jar; 赠送原API文档:guava-20.0-javadoc.jar; 赠送源代码:guava-20.0-sources.jar; 赠送Maven依赖信息文件:guava-20.0.pom; 包含翻译后的API文档:guava-20.0-javadoc-API文档-中文...

    guava-28.0-android-API文档-中英对照版.zip

    赠送jar包:guava-28.0-android.jar; 赠送原API文档:guava-28.0-android-javadoc.jar; 赠送源代码:guava-28.0-android-sources.jar; 赠送Maven依赖信息文件:guava-28.0-android.pom; 包含翻译后的API文档:...

Global site tag (gtag.js) - Google Analytics