博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java8新特性学习(二)- Optional类
阅读量:2443 次
发布时间:2019-05-10

本文共 5725 字,大约阅读时间需要 19 分钟。

背景

Optional是一个容器,用来管理一个对象。主要是用来解决null和NullPointerException问题。

Java7 -> Java8 Optional是如何简化你的代码

假设有一个Student类

@Datapublic class Student {
private String name; private Integer age; public Student() {
} public Student(String name, Integer age) {
this.name = name; this.age = age; }}

举例一

//java7    private String getJava7UpperCaseStudentName(Student student) {
if (student != null) {
String name = student.getName(); if (name != null) {
return name.toUpperCase(); } } return null; } //java8 private String getJava8UpperCaseStudentName(Student student) {
return Optional.ofNullable(student).map(Student::getName).map(String::toUpperCase).orElse(null); }

举例二

@Test    public void testOptionalOrElse() {
Student origin = null; Student defaultStudent = new Student("default", -1); //java7 Student java7Student = origin != null ? origin : defaultStudent; //java8 Student java8Student = Optional.ofNullable(origin).orElse(defaultStudent); System.out.println("java7Student : " + java7Student); System.out.println("java8Student : " + java8Student); }

可见,使用Optional可以简化代码。

用法及测试

of()、ofNullable()和empty()

@Test    public void testEmptyOptional() {
Optional
emptyOptional = Optional.empty(); System.out.println("emptyOptional.isPresent:" + emptyOptional.isPresent()); } @Test public void testOptional() {
Optional
nullStudentOptional = Optional.ofNullable(null); Optional
studentOptional = Optional.of(new Student("a", 1)); System.out.println("nullStudentOptional:" + nullStudentOptional.orElse(null)); System.out.println("studentOptional:" + studentOptional.orElse(null)); }

输出结果

emptyOptional.isPresent:falsenullStudentOptional:nullstudentOptional:Student(name=a, age=1)

of()函数传入的Object不能为空,否则会直接抛出空指针异常

ofNullable()函数传入的Object可为空

empty()函数会创建一个空的Optional对象,其value为null

isPresent()

@Test    public void testOptionalIsPresent() {
Optional
nullStudentOptional = Optional.ofNullable(null); Optional
studentOptional = Optional.of(new Student("a", 1)); System.out.println("nullStudentOptional.isPresent():" + nullStudentOptional.isPresent()); System.out.println("studentOptional.isPresent():" + studentOptional.isPresent()); }

输出结果

nullStudentOptional.isPresent():falsestudentOptional.isPresent():true

isPresent()函数会判断当前Optional容器保存的对象是否不为空,true表示不为空,false表示为空

IfPresent()

@Test    public void testOptionalIfPresent() {
Optional
studentOptional1 = Optional.of(new Student("a", 1)); studentOptional1.ifPresent(student -> {
System.out.println("accept student:" + student); student.setAge(student.getAge() * 2); student.setName(student.getName() + "-accept"); }); System.out.println("after accept student:" + studentOptional1.orElse(null)); }

运行结果

accept student:Student(name=a, age=1)after accept student:Student(name=a-accept, age=2)

orElseThrow()、orElseGet()

@Test    public void testOptionalOrElseThrow() {
Optional
studentOptional = Optional.ofNullable(null); Student student = studentOptional.orElseThrow(() -> new NullPointerException("studentOptional is null")); System.out.println("student : " + student); } @Test public void testOptionalOrElseGet() {
Optional
studentOptional = Optional.ofNullable(null); Student student = studentOptional.orElseGet(() -> new Student("zz", -1)); System.out.println("student : " + student); }

输出结果

结果1:java.lang.NullPointerException: studentOptional is null	at com.common.java8.OptionalTest.lambda$testOptionalOrElseThrow$7(OptionalTest.java:56)	at java.util.Optional.orElseThrow(Optional.java:290)	at com.common.java8.OptionalTest.testOptionalOrElseThrow(OptionalTest.java:56)...结果2:student : Student(name=zz, age=-1)

map()、flatMap()

public Optional map(Function
mapper) {
Objects.requireNonNull(mapper); if (!isPresent()) return empty(); else {
return Optional.ofNullable(mapper.apply(value)); } } public Optional flatMap(Function
> mapper) {
Objects.requireNonNull(mapper); if (!isPresent()) return empty(); else {
return Objects.requireNonNull(mapper.apply(value)); } }

从方法签名上看,两者返回参数相同,入参Function的返回参数不一样,一个是U,一个是Optional< U >, 但是他们都返回Optional< U >

@Test    public void testOptionalMapAndFlatMap() {
Optional
studentOptional = Optional.of(new Student("aa", 11)); System.out.println("map:" + studentOptional.map(Student::getName).orElse(null)); System.out.println("flatMap:" + studentOptional.flatMap(s -> Optional.of(s.getName())).orElse(null)); Optional
nameNullOptional = Optional.of(new Student(null, 11)); System.out.println("map:" + nameNullOptional.map(Student::getName).orElse(null)); System.out.println("flatMap:" + nameNullOptional.flatMap(s -> Optional.ofNullable(s.getName())).orElse(null)); System.out.println("flatMap:" + nameNullOptional.flatMap(s -> null).orElse(null)); }

输出结果

map:aaflatMap:aamap:nullflatMap:nulljava.lang.NullPointerException	at java.util.Objects.requireNonNull(Objects.java:203)	at java.util.Optional.flatMap(Optional.java:241)	at com.common.java8.OptionalTest.testOptionalMapAndFlatMap(OptionalTest.java:23)

从上面这种用法两者基本相同。但是在Optional类中,两个方法真正的区别是flatMap返回的必须是一个非空Optional值,否则会抛出NullPointException.

转载地址:http://khnqb.baihongyu.com/

你可能感兴趣的文章
vs2013项目迁移不成功_浏览器趋势2013年9月:迁移到Microsoft?
查看>>
如何在Windows上安装Ghost
查看>>
Magento电子商务网站的SEO指南
查看>>
用Mockery模拟您的测试依赖项
查看>>
Coderbits来自哪里?
查看>>
phpstorm -xmx_PhpStorm 8-新功能
查看>>
Chrome 27的新功能
查看>>
播客-SitePoint的新产品…
查看>>
浏览器趋势(2013年5月):IE8降至10%以下
查看>>
防弹您的Drupal网站
查看>>
采访:汤姆·奥兰(Tom Oram)和罗伯·艾伦(Rob Allen)
查看>>
将Solarium与SOLR结合使用进行搜索-Solarium和GUI
查看>>
ie浏览器报错:不支持此类_浏览器趋势(2013年3月):IE降至30%以下
查看>>
谁偷了我的CPU?
查看>>
Microsoft将IE10更新推送到Windows 7
查看>>
验证码放缓存里_浏览器趋势2013年8月:夏季放缓?
查看>>
liferay_云中的Liferay
查看>>
SQL或NoSQL:Google App Engine-第1部分
查看>>
SitePoint Podcast#178:Web设计过程和创造力
查看>>
移动端获取视频第一帧移动端_后端即服务-第1部分
查看>>