Java:Optional处理NullPointerException空指针异常的利器

简介: Java:Optional处理NullPointerException空指针异常的利器

代码运行环境


$ java -version

java version "1.8.0_251"

Java(TM) SE Runtime Environment (build 1.8.0_251-b08)

Java HotSpot(TM) 64-Bit Server VM (build 25.251-b08, mixed mode)


目录

1、empty()

2、of()

3、ofNullable()

4、isPresent()

5、get()

6、ifPresent()

7、filter()

8、map()

9、flatMap()

10、orElse()

11、orElseGet()

12、orElseThrow()

完整代码

1、empty()

empty 方法返回一个不包含值的 Optional 实例


Optional empty = Optional.empty();

System.out.println(empty);

// Optional.empty


2、of()

of 方法会返回一个 Optional 实例


如果传入的值非空,会返回包含指定值的对象;

如果传入空,会立刻抛出空指针异常。

Optional<String> name = Optional.of("Tom");

System.out.println(name);

// Optional[Tom]


Optional.of(null);

// java.lang.NullPointerException


3、ofNullable()

ofNullable 方法会返回一个 Optional 实例


如果传入的值非空,会返回包含指定值的对象;

如果传入空,会返回不包含任何值的 empty 对象,也就是最开始介绍的Optional.empty()对象。

Optional<String> name = Optional.ofNullable("Tom");

System.out.println(name);

// Optional[Tom]


Optional<Object> optional = Optional.ofNullable(null);

System.out.println(optional);

// Optional.empty


4、isPresent()

isPresent 方法用来判断实例是否包含值


如果包含非空值,返回 true

否则返回 false

boolean isPresent1 = Optional.ofNullable("Tom")

       .isPresent();

System.out.println(isPresent1);

// true


boolean isPresent2 = Optional.ofNullable(null)

       .isPresent();

System.out.println(isPresent2);

// false


5、get()

get 方法


如果实例包含非空值,则返回当前值;

否则抛出 NoSushElementException 异常。

String tom = Optional.ofNullable("Tom")

       .get();

System.out.println(tom);

// Tom


Optional.ofNullable(null)

       .get();

// java.util.NoSuchElementException: No value present


6、ifPresent()

ifPresent 方法


当实例包含非空值时,执行传入的 Consumer,比如调用一些其他方法;

如果包含的值为空,不执行任何操作。

Optional.ofNullable("Tom")

       .ifPresent(x -> {

           System.out.println(x);

           // Tom

       });



Optional.ofNullable(null)

       .ifPresent(x -> {

           System.out.println(x);

           // 没有任何输出

       });


7、filter()

filter 方法用于过滤不符合条件的值,接收一个Predicate参数,


如果符合条件,会返回当前的Optional实例,

否则返回 empty 实例。

Optional<String> optional1 = Optional.ofNullable("Tom")

       .filter(x -> x.contains("T"));

System.out.println(optional1);

// Optional[Tom]



Optional<String> optional2 = Optional.ofNullable("Tom")

       .filter(x -> x.contains("J"));

System.out.println(optional2);

// Optional.empty


8、map()

map 方法是链式调用避免空指针的核心方法


当实例包含值时,对值执行传入的Function函数接口方法,并返回一个代表结果值新的Optional实例,也就是将返回的结果再次包装成Optional对象。

Optional<String> optional1 = Optional.ofNullable("Tom")

       .map(x -> {

           return "hi " + x;

       });

System.out.println(optional1);

// Optional[hi Tom]


Optional<String> optional2 = Optional.ofNullable(null)

       .map(x -> {

           return "hi " + x;

       });

System.out.println(optional2);

// Optional.empty


9、flatMap()

flatMap 方法与 map 方法类似,

唯一不同的地方在于:需要手动将返回的值,包装成Optional实例,并且参数值不允许为空。


Optional<String> optional1 = Optional.ofNullable("Tom")

       .flatMap(x -> {

           return Optional.of("hi " + x);

       });


System.out.println(optional1);

// Optional[hi Tom]



Optional<String> optional2 = Optional.ofNullable(null)

       .flatMap(x -> {

           return Optional.of("hi " + x);

       });


System.out.println(optional2);

// Optional.empty


10、orElse()

orElse 方法


如果实例包含非空值,那么返回当前值;

否则返回指定的默认值。

String name1 = Optional.ofNullable("Tom")

       .orElse("Jack");

System.out.println(name1);

// Tom


Object name2 = Optional.ofNullable(null)

       .orElse("Jack");

System.out.println(name2);

// Jack


11、orElseGet()

orElseGet 方法


如果实例包含非空值,返回这个值;

否则,它会执行作为参数传入的Supplier函数式接口方法,并返回其执行结果。

String name1 = Optional.ofNullable("Tom")

       .orElseGet(() -> {

           return "Jack";

       });


System.out.println(name1);

// Tom



Object name2 = Optional.ofNullable(null)

       .orElseGet(() -> {

           return "Jack";

       });


System.out.println(name2);

// Jack


12、orElseThrow()

orElseThrow 方法


如果实例包含非空值,返回这个值;

否则,它会执行作为参数传入的异常类。

String name1 = Optional.ofNullable("Tom")

       .orElseThrow(() -> new RuntimeException("参数为空"));


System.out.println(name1);

// Tom


Object name2 = Optional.ofNullable(null)

       .orElseThrow(() -> new RuntimeException("参数为空"));


System.out.println(name2);

// java.lang.RuntimeException: 参数为空



完整代码

package com.example.demo;


import org.junit.jupiter.api.Test;


import java.util.Optional;


public class OptionalTest {

   @Test

   public void testOptionalEmpty() {

       Optional empty = Optional.empty();

       System.out.println(empty);

       // Optional.empty

   }


   @Test

   public void testOptionalOf() {

       Optional<String> name = Optional.of("Tom");

       System.out.println(name);

       // Optional[Tom]


       Optional.of(null);

       // java.lang.NullPointerException

   }


   @Test

   public void testOptionalOfNullable() {

       Optional<String> name = Optional.ofNullable("Tom");

       System.out.println(name);

       // Optional[Tom]


       Optional<Object> optional = Optional.ofNullable(null);

       System.out.println(optional);

       // Optional.empty

   }


   @Test

   public void testOptionalIsPresent() {

       boolean isPresent1 = Optional.ofNullable("Tom")

               .isPresent();

       System.out.println(isPresent1);

       // true


       boolean isPresent2 = Optional.ofNullable(null)

               .isPresent();

       System.out.println(isPresent2);

       // false

   }


   @Test

   public void testOptionalGet() {

       String tom = Optional.ofNullable("Tom")

               .get();

       System.out.println(tom);

       // Tom


       Optional.ofNullable(null)

               .get();

       // java.util.NoSuchElementException: No value present

   }


   @Test

   public void testOptionalIfPresent() {

       Optional.ofNullable("Tom")

               .ifPresent(x -> {

                   System.out.println(x);

                   // Tom

               });



       Optional.ofNullable(null)

               .ifPresent(x -> {

                   System.out.println(x);

                   // 没有任何输出

               });

   }


   @Test

   public void testOptionalFilter() {

       Optional<String> optional1 = Optional.ofNullable("Tom")

               .filter(x -> x.contains("T"));

       System.out.println(optional1);

       // Optional[Tom]



       Optional<String> optional2 = Optional.ofNullable("Tom")

               .filter(x -> x.contains("J"));

       System.out.println(optional2);

       // Optional.empty

   }


   @Test

   public void testOptionalMap() {

       Optional<String> optional1 = Optional.ofNullable("Tom")

               .map(x -> {

                   return "hi " + x;

               });

       System.out.println(optional1);

       // Optional[hi Tom]



       Optional<String> optional2 = Optional.ofNullable(null)

               .map(x -> {

                   return "hi " + x;

               });

       System.out.println(optional2);

       // Optional.empty

   }


   @Test

   public void testOptionalFlatMap() {

       Optional<String> optional1 = Optional.ofNullable("Tom")

               .flatMap(x -> {

                   return Optional.of("hi " + x);

               });


       System.out.println(optional1);

       // Optional[hi Tom]



       Optional<String> optional2 = Optional.ofNullable(null)

               .flatMap(x -> {

                   return Optional.of("hi " + x);

               });


       System.out.println(optional2);

       // Optional.empty

   }


   @Test

   public void testOptionalOrElse() {

       String name1 = Optional.ofNullable("Tom")

               .orElse("Jack");

       System.out.println(name1);

       // Tom


       Object name2 = Optional.ofNullable(null)

               .orElse("Jack");

       System.out.println(name2);

       // Jack


   }


   @Test

   public void testOptionalOrElseGet() {

       String name1 = Optional.ofNullable("Tom")

               .orElseGet(() -> {

                   return "Jack";

               });


       System.out.println(name1);

       // Tom


       Object name2 = Optional.ofNullable(null)

               .orElseGet(() -> {

                   return "Jack";

               });


       System.out.println(name2);

       // Jack

   }


   @Test

   public void testOptionalOrElseThrow() {

       String name1 = Optional.ofNullable("Tom")

               .orElseThrow(() -> new RuntimeException("参数为空"));


       System.out.println(name1);

       // Tom


       Object name2 = Optional.ofNullable(null)

               .orElseThrow(() -> new RuntimeException("参数为空"));


       System.out.println(name2);

       // java.lang.RuntimeException: 参数为空

   }

}



参考

【Java 8系列】Java开发者的判空利器 – Optional

Optional 是个好东西,你真的会用么?

————————————————

版权声明:本文为CSDN博主「彭世瑜」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/mouday/article/details/130762483

相关文章
|
1天前
|
Java 编译器 API
Java基础教程(17)-Java8中的lambda表达式和Stream、Optional
【4月更文挑战第17天】Lambda表达式是Java 8引入的函数式编程特性,允许函数作为参数或返回值。它有简洁的语法:`(parameters) -> expression 或 (parameters) ->{ statements; }`。FunctionalInterface注解用于标记单方法接口,可以用Lambda替换。
|
3天前
|
存储 Java 程序员
JavaSE&Java的异常
JavaSE&Java的异常
19 0
|
19天前
|
存储 Java API
java8新特性 lambda表达式、Stream、Optional
java8新特性 lambda表达式、Stream、Optional
|
19天前
|
Java
Java中的异常类总结
Java中的异常类总结
|
30天前
|
Java
Java8 Optional
Java8 Optional
11 0
|
1月前
|
SQL Java
java中的异常
java中的异常
10 1
|
1月前
|
Java 程序员 编译器
Java中异常
Java中异常
12 0
|
17天前
|
存储 C语言
C语言 — 指针进阶篇(下)
C语言 — 指针进阶篇(下)
20 0
|
17天前
|
存储 C语言 C++
C语言 — 指针进阶篇(上)
C语言 — 指针进阶篇(上)
27 0
|
23天前
|
存储 程序员 C语言
C语言指针的概念、语法和实现
在C语言中,指针是其最重要的概念之一。 本文将介绍C语言指针的概念、语法和实现,以及如何使用它们来编写高效的代码。
14 0