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

相关文章
|
4天前
|
自然语言处理 Java API
Java 8的Stream API和Optional类:概念与实战应用
【5月更文挑战第17天】Java 8引入了许多重要的新特性,其中Stream API和Optional类是最引人注目的两个。这些特性不仅简化了集合操作,还提供了更好的方式来处理可能为空的情况,从而提高了代码的健壮性和可读性。
26 7
|
6天前
|
Java 索引
【JAVA基础篇教学】第七篇:Java异常类型说明
【JAVA基础篇教学】第七篇:Java异常类型说明
|
1天前
|
Java 编译器
Java一分钟之——异常分类:检查异常与运行时异常
【5月更文挑战第20天】Java异常处理分为检查异常(Checked Exceptions)和运行时异常(Unchecked Exceptions),两者在编译期处理方式不同。检查异常需捕获或声明,如`IOException`,而运行时异常如`NullPointerException`在运行时终止程序。常见问题包括不恰当的异常使用、过度捕获和忽略异常信息。避免策略包括正确区分异常类型、具体捕获和处理异常信息。示例代码展示了如何处理这两种类型的异常。理解并妥善处理异常能提升程序的健壮性和可维护性。
23 4
|
1天前
|
Java
Java一分钟之——异常链:追踪错误源头
【5月更文挑战第20天】Java异常处理中的异常链机制有助于追踪错误源头。通过`initCause()`和`getCause()`方法,新异常与原始异常关联,提供丰富调试信息。常见问题包括忽略原始异常、过度包装和不正确调用`initCause()`。避免策略包括始终记录原始异常、适度创建自定义异常和正确使用`initCause()`。代码示例展示了如何在异常实例化时自动链接原始异常。异常链能改善错误追踪,加速问题解决。
23 3
|
5天前
|
Java
Java String 避免空指针的方法
Java String 避免空指针的方法
5 0
|
6天前
|
安全 Java 开发者
Java一分钟之-Optional类:优雅处理null值
【5月更文挑战第13天】Java 8的`Optional`类旨在减少`NullPointerException`,提供优雅的空值处理。本文介绍`Optional`的基本用法、创建、常见操作,以及如何避免错误,如直接调用`get()`、误用`if (optional != null)`检查和过度使用`Optional`。正确使用`Optional`能提高代码可读性和健壮性,建议结合实际场景灵活应用。
22 3
|
6天前
|
前端开发 Java 应用服务中间件
【异常解决】java程序连接MinIO报错The request signature we calculated does not match the signature you provided.
【异常解决】java程序连接MinIO报错The request signature we calculated does not match the signature you provided.
22 0
|
6天前
|
Java 关系型数据库 MySQL
【JAVA进阶篇教学】第八篇:Java链接MySql数据库异常
【JAVA进阶篇教学】第八篇:Java链接MySql数据库异常
|
6天前
|
存储 Java 开发者
探索Java开发中触发空指针异常的场景
作为一名后端开发者在Java编程的世界中,想必大家对空指针并不陌生,空指针异常是一种常见而又令人头疼的问题,它可能会在我们最不经意的时候突然出现,给我们的代码带来困扰,甚至导致系统的不稳定性,而且最可怕的是有时候不能及时定位到它的具体位置。针对这个问题,我们需要深入了解触发空指针异常的代码场景,并寻找有效的方法来识别和处理这些异常情况,而且我觉得空指针异常是每个Java开发者都可能面临的挑战,但只要我们深入了解它的触发场景,并采取适当的预防和处理措施,我们就能够更好地应对这个问题。那么本文就来分享一下实际开发中一些常见的触发空指针异常的代码场景,并分享如何有效地识别和处理这些异常情况。
22 1
探索Java开发中触发空指针异常的场景
|
6天前
|
C语言
C语言:数组和指针笔试题解析(包括一些容易混淆的指针题目)
C语言:数组和指针笔试题解析(包括一些容易混淆的指针题目)