为什么使用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

最新文章

  1. (转载)在Visual Studio 2015中使用Git
  2. 【HDU 4940】Destroy Transportation system(无源无汇带上下界可行流)
  3. Node.js的DES加解密和MD5加密
  4. 配置recovery_min_apply_delay后重启standby节点报错:psql: FATAL: the database system is starting up
  5. 《MORE EFFECTIVE C++》条款20 条款21
  6. 如何用 redis 造一把分布式锁
  7. eclipse 最有用的10个快捷键
  8. OpenGL超级宝典第5版&amp;&amp;GLSL法线变换
  9. 【leetcode】12. Integer to Roman
  10. GitHub这么火,程序员你不学学吗? 超简单入门教程 干货
  11. poj Cash Machine
  12. SSO 基于Cookie+fliter实现单点登录(SSO):工作原理
  13. Swift - 使用UI Dynamics给UIKit组件添加重力和碰撞行为
  14. 【Tesseract-OCR】在VS2012环境下调用API方法---注意避免名字冲突
  15. Sublime Text 使用介绍、全套快捷键及插件推荐
  16. JAVA数据结构之链表
  17. JVM垃圾回收算法解析
  18. git保存用户名和密码
  19. Visual Studio 由于缺少调试目标
  20. MQ选型对比RabbitMQ RocketMQ ActiveMQ Kafka(外加redis对比及其实现)

热门文章

  1. es6总结(九)--Iterator &amp; for of
  2. JAVA特性面试题:
  3. 从网上搜集的X86 显示 int 10H
  4. Hibernate游记——装备篇《二》(基础配置示例)
  5. Java 获取当前时间及实现时间倒计时功能
  6. Extjs grid增加或删除列后记住滚动条的位置
  7. 【Tensorflow】tf.argmax函数
  8. tensorflow搭建神经网络基本流程
  9. squirrelsql安装
  10. Hibernate操作Blob数据