Optional类

到目前为止,臭名昭著的空指针异常是导致Java应用程序失败的最常见原因。以前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码。受到Google Guava的启发,Optional类已经成为Java 8类库的一部分。

Optional实际上是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。

1 API

1.1 创建Optional对象

(1)static Optional empty() :用来创建一个空的Optional

@Test
public void test01(){Optional<String> opt = Optional.empty();System.out.println(opt);
}

(2)static Optional of(T value) :用来创建一个非空的Optional

@Test
public void test02(){String str = "hello";Optional<String> opt = Optional.of(str);System.out.println(opt);
}

(3)static Optional ofNullable(T value) :用来创建一个可能是空,也可能非空的Optional
//一般用这一种创建

@Test
public void test03(){String str = null;Optional<String> opt = Optional.ofNullable(str);System.out.println(opt);
}

1.2 从Optional容器中取出所包装的对象

(1)T get() :要求Optional容器必须非空

@Test
public void test04(){String str = "hello";Optional<String> opt = Optional.of(str);System.out.println(opt.get());
}

(2)T orElse(T other) :

用的最多

orElse(T other) 与ofNullable(T value)配合使用,

如果Optional容器中非空,就返回所包装值,如果为空,就用orElse(T other), other是指定的默认值(备胎)代替

@Test
public void test05(){String str = "涤魂圣枪";Optional<String> opt = Optional.ofNullable(str);String string = opt.orElse("圣枪游侠");System.out.println(string);
}

(3)T orElseGet(Supplier<? extends T> other) :

如果Optional容器中非空,就返回所包装值,如果为空,就用Supplier接口的Lambda表达式提供的值代替

@Test
public void test06(){Optional<String> optional = Optional.ofNullable("涤魂圣枪");String s = optional.orElseGet(() -> "圣枪游侠");//        String s = optional.orElseGet(() -> new String("圣枪游侠"));供给型接口System.out.println(s);
}

(4) T orElseThrow(Supplier<? extends X> exceptionSupplier)

如果Optional容器中非空,就返回所包装值,如果为空,就抛出你指定的异常类型代替原来的NoSuchElementException

@Test
public void test07(){String str = null;Optional<String> opt = Optional.ofNullable(str);String string = opt.orElseThrow(()->new RuntimeException("optional值为空"));System.out.println(string);
}

3、其他方法

(1)boolean isPresent() :判断Optional容器中是否有值

@Test
public void test08(){Optional<String> op = Optional.of("hello");boolean present = op.isPresent();System.out.println(present);
}

(2)void ifPresent(Consumer<? super T> consumer) :

判断Optional容器中的值是否存在,如果存在,就对它进行Consumer指定的操作,如果不存在就不做

@Test
public void test09(){Optional<String> op = Optional.of("hello");op.ifPresent(s -> System.out.println("存在值"));
}

(3) Optional map(Function<? super T,? extends U> mapper)

判断Optional容器中的值是否存在,如果存在,就对它进行Function接口指定的操作,如果不存在就不做

@Test
public void test10(){String str = "Hello";Optional<String> opt = Optional.ofNullable(str);//判断是否是纯字母单词,如果是,转为大写,否则保持不变String result = opt.filter(s->s.matches("[a-zA-Z]+")).map(s -> s.toLowerCase()).orElse(str);System.out.println(result);
}

2 练习

2.1 练习1

案例:

(1)声明一个Girl类型,包含姓名(String)属性

(2)声明一个Boy类型,包含姓名(String),女朋友(Girl)属性

(3)在测试类中,创建一个Boy对象,并

如果他有女朋友,显示他女朋友名称;

如果他没有女朋友,他的女朋友默认为“嫦娥”,即只能欣赏“嫦娥”了

class Girl{private String name;public Girl(String name) {super();this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Girl [name=" + name + "]";}}
class Boy{private String name;private Girl girlFriend;public Boy(String name, Girl girlFriend) {super();this.name = name;this.girlFriend = girlFriend;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Girl getGirlFriend() {return girlFriend;}public void setGirlFriend(Girl girlFriend) {this.girlFriend = girlFriend;}@Overridepublic String toString() {return "Boy [name=" + name + ", girlFriend=" + girlFriend + "]";}}

测试类

 public static void main(String[] args) {//      Boy boy = new Boy("张三",null);Boy boy = new Boy("张三",new Girl("翠翠"));Optional<Girl> grilFriend = Optional.ofNullable(boy.getGirlFriend());Optional.of(grilFriend.orElse(new Girl("嫦娥"))).ifPresent(g->System.out.println(g));}

2.2 练习2

案例:

(1)声明学生类,包含姓名和年龄

(2)添加几个学生对象到一个ArrayList集合中

(3)对集合中的学生进行操作,找出年龄大于30岁的,并取出第一个学生,如果没有这样的学生,用无参构造new一个学生对象,打印学生信息

学生类示例代码:

class Student{private String name;private int age;public Student(String name, int age) {super();this.name = name;this.age = age;}public Student() {super();}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student [name=" + name + ", age=" + age + "]";}
}

测试类


@Test
public void test1(){ArrayList<Student> list = new ArrayList<>();list.add(new Student("张三", 23));//...//取出流中第一个年龄大于30岁的学生的年龄,并打印它的年龄,如果没有,用无参构造创建一个学生对象Student stu = list.stream().filter(s -> s.getAge()>30).findFirst().orElse(new Student());System.out.println("学生的年龄:" + stu.getAge());
}

JDK8新特性之Optional类相关推荐

  1. JDK8新特性之Optional

    转载自 JDK8新特性之Optional Optional是什么 java.util.Optional Jdk8提供 Optional,一个可以包含null值的容器对象,可以用来代替xx != nul ...

  2. Java 8新特性:Optional类

    Java 8新特性:Optional类 在上一篇介绍Stream流式数据处理的文章中提到了Optional类,这是Java 8新增的一个类,用以解决程序中常见的NullPointerException ...

  3. 【Optional类】JDK1.8新特性之Optional类的使用

    这篇文章,主要介绍JDK1.8新特性之Optional类的使用. 目录 一.Optional类 1.1.Optional类介绍 1.2.Optional属性和方法 (1)value属性 (2)私有构造 ...

  4. optional 解决空指针_Java8新特性:Optional类的正确使用姿势

    空指针异常是我们在实际开发中经常会遇到的问题,为了防止程序因为异常而中断,通常要在代码中添加大量的非空验证,例如一个释放 JDBC 相关资源的代码,如下所示. public static void r ...

  5. Java8新特性之Optional类(附代码案例)

    1. 概述 Optional< T >类是要给容器类,它可以保存类型T的值,代表这个值存在.或者仅仅保存null, 表示这个值不存在.原来用null表示一个值不存在,现在Optional可 ...

  6. JDK8新特性相关知识讲解汇总

    以下是博主本人对jdk8相关新知识的学习以及讲解的汇总,如果对你帮助可以多多点赞和关注我哦~ (1)JDK8新特性-Lambda表达式详细介绍以及应用 (2)JDK8 关于中断线程的总结 (3)JDK ...

  7. Jdk8新特性一:jdk8新特性之default关键字、日期类、Base64类、Optional

    Jdk8新特性一:jdk8新特性之default关键字.日期类.Base64类.Optional 文章目录 Jdk8新特性一:jdk8新特性之default关键字.日期类.Base64类.Option ...

  8. JDK8新特性-Optional类

    个人简介 作者是一个来自河源的大三在校生,以下笔记都是作者自学之路的一些浅薄经验,如有错误请指正,将来会不断的完善笔记,帮助更多的Java爱好者入门. 文章目录 个人简介 JDK8新特性-Option ...

  9. JDK8新特性详解Lambda、StreamAPI、Optional等

    JDK8学习笔记 学习视频地址:https://www.bilibili.com/video/BV1k64y1R7sA 操作代码:https://gitee.com/rederic/study-jdk ...

最新文章

  1. winform DataGrid排序、去掉第一的空白列
  2. Android中用GridView实现九宫格的两种方法(转)
  3. 易语言 字段重复_使对易失性字段的操作原子化
  4. JavaFX 2 GameTutorial第4部分
  5. mysql浅拷贝_深拷贝与浅拷贝
  6. java 自定义解码_[求助],java如何使用自定义注解对入参进行解密?
  7. python文件,字符串,二进制的读写
  8. 支付宝:“我的小程序”用户访问量一周激增165%
  9. dos命令窗口光标闪烁_10 分钟上手 Vim,常用命令大盘点
  10. 微服务的隔离和熔断机制
  11. spring揭秘 读书笔记 六 bean的一生
  12. Spark服务启动的一些总结
  13. RK3399的ADC配置指南
  14. php工作在fastcgi模式下怎样配置xcache,FastCGI模式编译安装LAMP+XCache
  15. JAVA NP插件,特定的宽度600,插件就不显示
  16. 软件详细设计的几个参考模板
  17. 软件项目管理中的需求管理要以用户为中心
  18. 更上一层楼,数学是基础——渐近线和可分离变量微分方程
  19. CentOS7 忘记密码——重置
  20. 七、vertical-align属性、透明度属性及兼容、ps常用工具、常见的图片格式、项目规范、命名参考、iconfont的使用...

热门文章

  1. 面试的努力!只为简历上吹过的牛逼……
  2. 90后学生开发刷机精灵 身家千万买房赠父母
  3. python培训 线上VIP课费用
  4. 【ios】大神论坛之iCleaner Pro 网络验证和注册算法分析
  5. salesforce——Apex查询公司财年和财季开始和结束时间(SOQL)
  6. 前端文件下载的打开方式
  7. powerdesigner ER图建模教程
  8. 开excel收到编译错误,找不到工程或库
  9. CSS3_线性渐变_径向渐变----背景
  10. iOS开发教程之OC语言-欧阳坚-专题视频课程