为什么使用optional

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

创建方法

Optional.of(T):获得一个Optional对象,其内部包含了一个非null的T数据类型实例,若T=null,则立刻报错。
Optional.absent():获得一个Optional对象,其内部包含了空值
Optional.fromNullable(T):将一个T的实例转换为Optional对象,T的实例可以不为空,也可以为空[Optional.fromNullable(null),和Optional.absent()等价。

例子:

    public static void testNull(){
//one
Integer nubmerone=4;
Optional<Integer> integerOptional = Optional.of(nubmerone);//若引用为null则快速失败触发java.lang.NullPointerException
//two
Optional<Integer> nullOptional=Optional.absent();//创建引用缺失的Optional实例,就是为NULL的
//three
Optional<Integer> possible = Optional.fromNullable(5); //创建允许null值的Optional }

常用方法

  1. boolean isPresent():如果Optional包含的T实例不为null,则返回true;若T实例为null,返回false
  2. T get():返回Optional包含的T实例,该T实例必须不为空;否则,对包含null的Optional实例调用get()会抛出一个IllegalStateException异常
  3. T or(T):若Optional实例中包含了传入的T的相同实例,返回Optional包含的该T实例,否则返回输入的T实例作为默认值
  4. T orNull():返回Optional实例中包含的非空T实例,如果Optional中包含的是空值,返回null,逆操作是fromNullable()
  5. Set<T> asSet():返回一个不可修改的Set,该Set中包含Optional实例中包含的所有非空存在的T实例,且在该Set中,每个T实例都是单态,如果Optional中没有非空存在的T实例,返回的将是一个空的不可修改的Set。

例子:

    public static void testNull(){
testMethodReturn();
} public static void testMethodReturn() {
Optional<Long> value = method();//获得一个Optional对象,其内部包含了空值
if(value.isPresent()==true){
System.out.println("获得返回值: " + value.get());
}else{
//value是空值,返回输入的值
System.out.println("1、获得返回值: " + value.or(-12L));
}
//value是空值,返回null
System.out.println("2、获得返回值 orNull: " + value.orNull()); Optional<Long> valueNoNull = methodNoNull();//获得一个Optional对象,值为15
if(valueNoNull.isPresent()==true){
Set<Long> set=valueNoNull.asSet();//返回一个不可修改的Set
System.out.println("3、获得返回值 set 的 size : " + set.size());
//返回Optional包含的T实例
System.out.println("4、获得返回值: " + valueNoNull.get());
}else{
System.out.println("获得返回值: " + valueNoNull.or(-12L));
}
//引用值不为null,返回引用值
System.out.println("5、获得返回值 orNull: " + valueNoNull.orNull());
}

运行结果

1、获得返回值: -12
2、获得返回值 orNull: null
3、获得返回值 set 的 size : 1
4、获得返回值: 15
5、获得返回值 orNull: 15

Google Guava之Optional优雅的使用null的更多相关文章

  1. Guava学习笔记(1):Optional优雅的使用null

    转自:http://www.cnblogs.com/peida/archive/2013/06/14/Guava_Optional.html 参考:[Google Guava] 1.1-使用和避免nu ...

  2. [Google Guava] 1.1-使用和避免null

    原文链接 译文链接 译者: 沈义扬    Doug Lea 说,“Null 真糟糕.”   当Sir C. A. R. Hoare 使用了null引用后说,”使用它导致了十亿美金的错误.” 轻率地使用 ...

  3. Guava学习笔记:Optional优雅的使用null

    在我们学习和使用Guava的Optional之前,我们需要来了解一下Java中null.因为,只有我们深入的了解了null的相关知识,我们才能更加深入体会领悟到Guava的Optional设计和使用上 ...

  4. Optional优雅的使用null

    在我们学习和使用Guava的Optional之前,我们需要来了解一下Java中null.因为,只有我们深入的了解了null的相关知识,我们才能更加深入体会领悟到Guava的Optional设计和使用上 ...

  5. Google Guava官方教程(中文版)

    Google Guava官方教程(中文版) 原文链接  译文链接 译者: 沈义扬,罗立树,何一昕,武祖  校对:方腾飞 引言 Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库, ...

  6. 使用Optional优雅处理null

    先假设一个场景.如下所示 public class Person { private String name; public Person() { } public Person(String nam ...

  7. Google Guava新手教程

         以下资料整理自网络 一.Google Guava入门介绍 引言 Guavaproject包括了若干被Google的 Java项目广泛依赖 的核心库,比如:集合 [collections] . ...

  8. Google Guava入门教程

    以下资料整理自网络 一.Google Guava入门介绍 引言 Guava 工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] .缓存 [cachi ...

  9. Guava学习笔记:Google Guava 类库简介

    http://www.cnblogs.com/peida/tag/Guava/ Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, cachin ...

随机推荐

  1. angular关于依赖注入

    <html> <head> <title>Angular JS Forms</title> </head> <body> < ...

  2. gpio_direction_output vs gpio_set_value之间的使用关系

    在Linux驱动中常常会碰到gpio_set_value(port_num,0/1)或gpio_direction_output (port_num,0/1) 这两者有什么关系呢gpio_set_va ...

  3. AC日记——花店橱窗布置 codevs 1028

    题目描述 Description 假设以最美观的方式布置花店的橱窗,有F束花,V个花瓶,我们用美学值(一个整数)表示每束花放入每个花瓶所产生的美学效果.为了取得最佳的美学效果,必须使花的摆放取得最大的 ...

  4. HDU 4912 Paths on the tree(LCA+贪心)

    题目链接 Paths on the tree 来源  2014 多校联合训练第5场 Problem B 题意就是给出m条树上的路径,让你求出可以同时选择的互不相交的路径最大数目. 我们先求出每一条路径 ...

  5. robot upstart 问题

    1.启动后在记录文件发现左轮节点未启动: 因为左边的类未实例化,不会去订阅消息然后初始化 2.两个节点均可以启动后,发现启动后又死掉 因为在程序里有getenv(“HOME”)然后付给string,g ...

  6. Xamarin.Forms单元控件Cell

    Xamarin.Forms单元控件Cell   单元控件Cell是Xamarin.Forms为ListView和TableView专门定制的一类项目元素.它包括5个控件,分别为文本框单元EntryCe ...

  7. Ural 1780 Gray Code 乱搞暴力

    原题链接:http://acm.timus.ru/problem.aspx?space=1&num=1780 1780. Gray Code Time limit: 0.5 secondMem ...

  8. "=="与equals的区别与联系

    "=="可作用于基本类型变量和引用类型变量: 1.当作用于基本类型变量时,比较的是变量的值是否相等. 2.当作用于引用变量时,比较的是该变量在内存中地址. "equals ...

  9. C# SQL帮助类

    C# SQL帮助类 本人自己封装的SQLHelper类,执行sql server与Oracle数据的增删改查 vs自带的Oracle数据库引用需要安装Oracle客户端,如不想安装Oracle客户端, ...

  10. Netty----start

    一直欠着netty的帐,这次开始换上,netty 开始,学习的话,直接搞个源码的例子   http://central.maven.org/maven2/io/netty/netty-example/ ...