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

相关文章
|
3月前
|
安全 Java API
告别繁琐编码,拥抱Java 8新特性:Stream API与Optional类助你高效编程,成就卓越开发者!
【8月更文挑战第29天】Java 8为开发者引入了多项新特性,其中Stream API和Optional类尤其值得关注。Stream API对集合操作进行了高级抽象,支持声明式的数据处理,避免了显式循环代码的编写;而Optional类则作为非空值的容器,有效减少了空指针异常的风险。通过几个实战示例,我们展示了如何利用Stream API进行过滤与转换操作,以及如何借助Optional类安全地处理可能为null的数据,从而使代码更加简洁和健壮。
107 0
|
19天前
|
存储 设计模式 缓存
从一个 NullPointerException 探究 Java 的自动装箱拆箱机制
这行代码一个对象方法都没有调用,怎么会抛出 NullPointerException 呢?
26 9
|
28天前
|
Java
Java“NullPointerException”解决
Java中的“NullPointerException”是常见的运行时异常,发生在尝试使用null对象实例的方法或字段时。解决方法包括:1. 检查变量是否被正确初始化;2. 使用Optional类避免null值;3. 增加空指针检查逻辑。
|
2月前
|
设计模式 Java
结合HashMap与Java 8的Function和Optional消除ifelse判断
`shigen`是一位致力于记录成长、分享认知和留住感动的博客作者。本文通过具体代码示例探讨了如何优化业务代码中的if-else结构。首先展示了一个典型的if-else处理方法,并指出其弊端;然后引入了策略模式和工厂方法等优化方案,最终利用Java 8的Function和Optional特性简化代码。此外,还提到了其他几种消除if-else的方法,如switch-case、枚举行、SpringBoot的IOC等。一起跟随shigen的脚步,让每一天都有所不同!
35 10
结合HashMap与Java 8的Function和Optional消除ifelse判断
|
21天前
|
Java 容器
Java“NullPointerException”解决
Java中的“NullPointerException”是当程序试图使用一个空对象引用时抛出的异常。解决方法包括:检查变量是否为null、使用Optional类、利用断言和合理初始化变量等。确保代码健壯性,避免运行时错误。
|
3月前
|
资源调度 监控 关系型数据库
实时计算 Flink版操作报错合集之处理大量Join时报错空指针异常,是什么原因
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
实时计算 Flink版操作报错合集之处理大量Join时报错空指针异常,是什么原因
|
3月前
|
安全 Java API
Java 8 流库的魔法革命:Filter、Map、FlatMap 和 Optional 如何颠覆编程世界!
【8月更文挑战第29天】Java 8 的 Stream API 通过 Filter、Map、FlatMap 和 Optional 等操作,提供了高效、简洁的数据集合处理方式。Filter 用于筛选符合条件的元素;Map 对元素进行转换;FlatMap 将多个流扁平化合并;Optional 安全处理空值。这些操作结合使用,能够显著提升代码的可读性和简洁性,使数据处理更为高效和便捷。
115 0
|
4月前
|
运维
系统日志使用问题之如何防止在打印参数时遇到NPE(空指针异常)
系统日志使用问题之如何防止在打印参数时遇到NPE(空指针异常)
|
4月前
|
缓存 Java 数据库连接
Java演进问题之指针的间接获取现在对性能的影响变得更大如何解决
Java演进问题之指针的间接获取现在对性能的影响变得更大如何解决
|
1月前
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
22 0