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 语句,可以更灵活地处理程序中的错误情况。
59 1
|
1月前
|
Java API 调度
如何避免 Java 中的 TimeoutException 异常
在Java中,`TimeoutException`通常发生在执行操作超过预设时间时。要避免此异常,可以优化代码逻辑,减少不必要的等待;合理设置超时时间,确保其足够完成正常操作;使用异步处理或线程池管理任务,提高程序响应性。
62 12
|
1月前
|
Java
在 Java 中,如何自定义`NumberFormatException`异常
在Java中,自定义`NumberFormatException`异常可以通过继承`IllegalArgumentException`类并重写其构造方法来实现。自定义异常类可以添加额外的错误信息或行为,以便更精确地处理特定的数字格式转换错误。
34 1
|
1月前
|
IDE 前端开发 Java
怎样避免 Java 中的 NoSuchFieldError 异常
在Java中避免NoSuchFieldError异常的关键在于确保类路径下没有不同版本的类文件冲突,避免反射时使用不存在的字段,以及确保所有依赖库版本兼容。编译和运行时使用的类版本应保持一致。
66 7
|
1月前
|
Java 编译器
如何避免在 Java 中出现 NoSuchElementException 异常
在Java中,`NoSuchElementException`通常发生在使用迭代器、枚举或流等遍历集合时,尝试访问不存在的元素。为了避免该异常,可以在访问前检查是否有下一个元素(如使用`hasNext()`方法),或者使用`Optional`类处理可能为空的情况。正确管理集合边界和条件判断是关键。
70 6
|
1月前
|
Java
Java异常捕捉处理和错误处理
Java异常捕捉处理和错误处理
64 1
|
1月前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
58 2
|
Java 容器 数据库连接
Java NullPointerException原因知多少
  有一句古诗云:夜来风雨声,花落知多少,套用一下空指针异常抛出来,原因知多少。 使用Java语言开发应用程序不管是J2SE还是J2EE的,没有几个开发者没经历空指针异常 (NullPointerException)错误的,作为一个runtime Exception最为常见的几种原因是: 1.
1153 0
|
5天前
|
安全 Java API
java如何请求接口然后终止某个线程
通过本文的介绍,您应该能够理解如何在Java中请求接口并根据返回结果终止某个线程。合理使用标志位或 `interrupt`方法可以确保线程的安全终止,而处理好网络请求中的各种异常情况,可以提高程序的稳定性和可靠性。
35 6
|
20天前
|
设计模式 Java 开发者
Java多线程编程的陷阱与解决方案####
本文深入探讨了Java多线程编程中常见的问题及其解决策略。通过分析竞态条件、死锁、活锁等典型场景,并结合代码示例和实用技巧,帮助开发者有效避免这些陷阱,提升并发程序的稳定性和性能。 ####