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
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
56 1
|
28天前
|
Java API 调度
如何避免 Java 中的 TimeoutException 异常
在Java中,`TimeoutException`通常发生在执行操作超过预设时间时。要避免此异常,可以优化代码逻辑,减少不必要的等待;合理设置超时时间,确保其足够完成正常操作;使用异步处理或线程池管理任务,提高程序响应性。
59 12
|
1月前
|
Java
在 Java 中,如何自定义`NumberFormatException`异常
在Java中,自定义`NumberFormatException`异常可以通过继承`IllegalArgumentException`类并重写其构造方法来实现。自定义异常类可以添加额外的错误信息或行为,以便更精确地处理特定的数字格式转换错误。
32 1
|
1月前
|
IDE 前端开发 Java
怎样避免 Java 中的 NoSuchFieldError 异常
在Java中避免NoSuchFieldError异常的关键在于确保类路径下没有不同版本的类文件冲突,避免反射时使用不存在的字段,以及确保所有依赖库版本兼容。编译和运行时使用的类版本应保持一致。
63 7
|
1月前
|
Java 编译器
如何避免在 Java 中出现 NoSuchElementException 异常
在Java中,`NoSuchElementException`通常发生在使用迭代器、枚举或流等遍历集合时,尝试访问不存在的元素。为了避免该异常,可以在访问前检查是否有下一个元素(如使用`hasNext()`方法),或者使用`Optional`类处理可能为空的情况。正确管理集合边界和条件判断是关键。
63 6
|
1月前
|
Java
Java异常捕捉处理和错误处理
Java异常捕捉处理和错误处理
60 1
|
1月前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
53 2
|
25天前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
92 13
|
2月前
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
35 0
|
3月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
121 4