参考资料:https://www.baeldung.com/java-optional

    https://mp.weixin.qq.com/s/P2kb4fswb4MHfb0Vut_kZg

1. 描述

  Optional是java.util包中的一部分,所以要有相关的引用:

import java.util.Optional;

2. 创建Optional方法

2.1 empty,创建一个空的Optional

@Test
public void whenCreatesEmptyOptional_thenCorrect() {
Optional<String> empty = Optional.empty();
assertFalse(empty.isPresent());
}

2.2 of,创建Optional,使用of方法时,传入不能为null,否则会报NullPointerException异常:

@Test
public void givenNonNull_whenCreatesNonNullable_thenCorrect() {
String name = "baeldung";
Optional<String> opt = Optional.of(name);
assertTrue(opt.isPresent());
}

2.3 ofNullable,创建Optional,ofNullable方法是允许值为null的

@Test
public void givenNonNull_whenCreatesNullable_thenCorrect() {
String name = "baeldung";
Optional<String> opt = Optional.ofNullable(name);
assertTrue(optionalName.isPresent());
}

3. 判断Optional的值

3.1 isPrensent,判断Optional是否有值,返回boolean类型,上面几个创建例子都用了isPresent,源码:

public boolean isPresent() {
return value != null;

3.2 ifPrensent,如果Optional有值,执行后面函数

@Test
public void givenOptional_whenIfPresentWorks_thenCorrect() {
Optional<String> opt = Optional.of("baeldung");
opt.ifPresent(name -> System.out.println(name.length()));
}

  如果在Optional为null的情况下,直接使用ifPresent有可能会报NullPointerException,所以就有了下面几个函数。

3.3 orElse和orElseGet,返回Optional包裹的值,如果值为null,则返回函数内的默认值,这两个方法的区别在于orElse后面跟默认值对象,orElseGet跟的是表达式函数。

@Test
public void whenOrElseWorks_thenCorrect() {
String nullName = null;
String name = Optional.ofNullable(nullName).orElse("john");
assertEquals("john", name);
} @Test
public void whenOrElseGetWorks_thenCorrect() {
String nullName = null;
String name = Optional.ofNullable(nullName).orElseGet(() -> "john");
assertEquals("john", name);
}

3.4 orElseThrow,返回Optional包裹的值,如果值为null,则抛出异常

@Test(expected = IllegalArgumentException.class)
public void whenOrElseThrowWorks_thenCorrect() {
String nullName = null;
String name = Optional.ofNullable(nullName).orElseThrow(IllegalArgumentException::new);
}

3.5 get,返回Optional包裹的值,如果值为null,会抛出NoSuchElementException异常

@Test(expected = NoSuchElementException.class)
public void givenOptionalWithNull_whenGetThrowsException_thenCorrect() {
Optional<String> opt = Optional.ofNullable(null);
String name = opt.get();
}

4. Optional值的操作

4.1 map,将一个值转换成另一个值,下面的例子是返回字符串的长度,没有则返回默认值0

@Test
public void givenOptional_whenMapWorks_thenCorrect2() {
String name = "baeldung";
Optional<String> nameOptional = Optional.of(name);
int len = nameOptional.map(String::length).orElse(0);
assertEquals(8, len);
}

4.2 filter,用于过滤。接收一个函数式接口,当符合接口时,则返回一个Optional对象,否则返回一个空的Optional对象

@Test
public void whenOptionalFilterWorks_thenCorrect() {
Integer year = 2016;
Optional<Integer> yearOptional = Optional.of(year);
boolean is2016 = yearOptional.filter(y -> y == 2016).isPresent();
assertTrue(is2016);
boolean is2017 = yearOptional.filter(y -> y == 2017).isPresent();
assertFalse(is2017);
}

5. 与Lambda表达式结合使用,优化代码

5.1 条件为true就执行

优化前:

String person = "wo are you";
if(person != null){
System.out.println(person);
}

优化后:

Optional<String> optional = Optional.of("wo are you");
optional.ifPresent(System.out::println);

5.2 条件为true就返回,false返回默认值

优化前:

String person = "wo are you";
if(person != null){
System.out.println(person);
} else {
return DEFAULT_VALUE;
}

优化后:

Optional<String> optional = Optional.of("wo are you");
return optional.orElse(DEFAULT_VALUE);

5.3 条件为true就返回,false调用函数生成

优化前:

String person = "wo are you";
if(person != null){
System.out.println(person);
} else {
return createPerson();
}

优化后:

Optional<String> optional = Optional.of("wo are you");
return optional.orElseGet(t -> createPerson());

5.4 连环null检查

优化前:

Person person = new Person("Tom");
if(person != null){
String name = person.getLastName();
if(name != null){
return name.toLowerCase();
} else {
return null;
}
} else {
return null;
}

优化后:

Optional<Person> optional = Optional.ofNullable(new Person("Tom"));
return optional.map(p -> p.getLastName()).map(name -> name.toUpperCase()).orElse(null);

JDK8的Optional用法的更多相关文章

  1. JDK8,Optional

     作为程序员,你肯定遇到过NullPointerException, 这个异常对于初出茅庐的新人, 还是久经江湖的老手都是不可避免的痛, 可又是那么的无能为力,为了解决它,你只能在使用某个值之前,对其 ...

  2. Optional用法与争议点

    原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介 要说Java中什么异常最容易出现,我想NullPointerException一定当仁不让,为了解决这种null值 ...

  3. JDK8中`Optional.orElse()` 和`Optional.orElseGet()`之间的区别

    看例子就明白了 ``` static String B() { System.out.println("B()..."); return "B"; } publ ...

  4. JDK8的LocalDateTime用法

    参考资料:好好学Java  https://mp.weixin.qq.com/s/Dd_7yUh3lq3TqE2cjsYXvw JDK8新特性里提供了3个时间类:LocalDate.LocalTime ...

  5. java8 :: 用法 (JDK8 双冒号用法)

    https://www.cnblogs.com/tietazhan/p/7486937.html

  6. JDK8新特性之Optional

    Optional是什么 java.util.Optional Jdk8提供Optional,一个可以包含null值的容器对象,可以用来代替xx != null的判断. Optional常用方法 of ...

  7. 给女朋友讲解什么是Optional【JDK 8特性】

    前言 只有光头才能变强 前两天带女朋友去图书馆了,随手就给她来了一本<与孩子一起学编程>的书,于是今天就给女朋友讲解一下什么是Optional类. 至于她能不能看懂,那肯定是看不懂的.(学 ...

  8. jdk8新特性-stream

    一.什么是流stream 1.可理解为高级版本的 Iterator 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的. 2.单向,不可往复 数据只能遍历一次,遍历过一次后即用尽了,就好比 ...

  9. java代码之美(16) ---Java8 Optional

    Java8 Optional 一句话介绍Optional类:使用JDK8的Optional类来防止NullPointerException(空指针异常)问题. 一.前言 在我们开放过程中,碰到的异常中 ...

随机推荐

  1. JAVA基础笔记15-16-17-18

    十五.今日内容介绍 1.Object 2.String 3.StringBuilder =第一节课开始======================= 01API概念 * A:API(Applicati ...

  2. request.headers.get头部获取内容的缺失

    1.说明 今天遇到了一个小坑,在做权限控制的时候,用头部传递了参数取名为table_privilege_id, 在本地测试的时候是可以接到这个参数的,但是通过ngxin转发之后,奇怪了,怎么也拿不到这 ...

  3. CSS3 实现复杂的背景图案

    灵活的背景定位 实现效果: 将背景图定位到距离容器底边 10px 且距离右边 20px 的位置. background-position 方案 代码: <div>海盗密码</div& ...

  4. SpringBoot入门详细教程

    一.SpringBoot入门 1.SpringBoot简介 SpringBoot是整个Spring技术栈的整合,来简化Spring应用开发,约定大于配置,去繁从简,just run 就能创建一 个独立 ...

  5. 数据可视化基础专题(七):Pandas基础(六) 数据增删改以及相关操作

    首先第一部还是导入 Pandas 与 NumPy ,并且要生成一个 DataFrame ,这里小编就简单的使用随机数的形式进行生成,代码如下: import numpy as np import pa ...

  6. 数据可视化之PowerQuery篇(十二)客户购买频次分布

    https://zhuanlan.zhihu.com/p/100070260 商业数据分析通常都可以简化为对数据进行筛选.分组.汇总的过程,本文通过一个实例来看看PowerBI是如何快速完成整个过程的 ...

  7. 关于报错,Whoops! Lost connection to ws://XXX.XXX.XXX.XXX:15684/ws

    昨天,在玩rabbitMQ时候,用stompJS从web连接ranbbitMQ时,报了标题的错误消息! 我把我这个html页面代码贴上,简单得讲,就是断开后,重新连接即可.

  8. 软件测试大牛都是这样写测试用例的,你get到了嘛?

    1. 用于语句覆盖的基路径法 基路径法保证设计出的测试用例,使程序的每一个可执行语句至少执行一次,即实现语句覆盖.基路径法是理论与应用脱节的典型,基本上没有应用价值,读者稍作了解即可,不必理解和掌握. ...

  9. 集训作业 洛谷P1469 找筷子

    这个题的代码真的是短的不得了呢. 有个神奇的东西叫异或,写起来是这个样子的^. 这个东西可以查看2个数的二进制某位是否相同,相同取0,不同取1.虽然我用的不熟,但我可以想出来,如果2个相同的数异或,答 ...

  10. vuex : 用vuex控制侧栏点亮状态

    上代码. xxx.vue <template> <div id="xxx"> <div class="layout"> &l ...