Java基础教程之常用类库 · Optional类 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 常用操作API3.2 案例3.3 使用技巧 4️⃣ 应用场景5️⃣ 实现原理🌾 总结 1️⃣ 概念 O
Optional
类是Java 8引入的新特性,旨在解决空值(null
)的处理问题。它的设计目的是为了提供一种更好的方式来处理可能为空的值,避免使用null
导致空指针异常。
Optional
是一个容器对象,可以持有某个类型的非空值或者空值。它是一个包装类,用于替代可能为空的引用变量。
下面是Optional
类的几个特征:
Optional
可以持有非空的值或空值;Optional
对象进行操作和转换;Optional
提供了一套简洁的api,方便进行空值处理。优点:
缺点:
Java的Optional
使用流程如下:
创建Optional
对象:
Optional.ofNullable(value)
创建一个Optional
对象,并将value
作为包装值,value
可以是null
。Optional.of(value)
创建一个Optional
对象,并将 value
作为包装值,value
不能为null
,否则会抛出NullPointerException
。判断Optional
对象是否包含值:
optional.isPresent()
方法判断 Optional
对象是否包含非空值。optional.isEmpty()
方法判断Optional对象是否为空。获取Optional
对象的值:
optional.get()
方法获取对象中的值。如果Optional
对象包含值,返回该值;否则抛出NoSuchElementException
异常。使用默认值:
optional.orElse(defaultValue)
方法获取Optional
对象的值。如果对象包含值,则返回该值;否则返回指定的默认值。optional.orElseGet(supplier)
方法获取Optional
对象的值。如果对象包含值,则返回该值;否则使用供应商函数生成一个值并返回。条件过滤:
optional.filter(predicate)
方法根据条件过滤 Optional
对象。匹配的话返回当前对象,否则返回空的Optional
对象。转换值类型:
optional.map(mapper)
方法将Optional
对象中的值转换为mapper
函数的结果,并返回新的对象。optional.flatMap(mapper)
方法类似 map
操作,但是返回的是 mapper
函数所返回的Optional
对象本身。其他常用方法:
optional.ifPresent(consumer)
方法,如果Optional
对象包含值,则执行传入的操作。optional.orElseThrow()
方法,获取Optional
对象的值,如果Optional
对象包含值,则返回该值;否则抛出NoSuchElementException
异常。在使用Optional
时,应根据具体场景选择合适的方法进行操作。在链式调用中,可以通过一系列的 Optional
操作来进行连续、安全和可读性更高的调用流程,处理可能为空的值。
此外,使用Optional
还需要注意谨慎使用get()
方法获取对象的值,最好使用更安全的方法如ifPresent
、orElse
等进行值的处理,以避免空指针异常的发生。
Java的 Optional
类中全部的操作方法API汇总如下表:
方法名 | 说明 |
---|---|
boolean isPresent() | 判断Optional对象是否包含值。如果Optional对象包含非空值,返回true;否则返回false |
ifPresent(Consumer super T> consumer) | 如果Optional对象包含值,则执行传入的操作 |
T get() | 如果Optional对象包含值,返回该值;否则抛出NoSuchElementException异常 |
T orElse(T other) | 获取Optional对象的值,若不存在则返回默认值other |
T orElseGet(Supplier extends T> other) | 获取Optional对象的值,若不存在则使用提供的Supplier生成一个新值并返回 |
T orElseThrow() | 获取Optional对象的值,若不存在则抛出NoSuchElementException异常 |
Optional filter(Predicate super T> predicate) | 如果Optional对象包含值且满足条件,则返回当前Optional对象;否则返回空的Optional对象 |
map(Function super T, ? extends U> mapper) | 对Optional对象中的值进行映射操作,返回新的Optional对象 |
flatMap(Function super T, Optional> mapper) | 类似map操作,但返回的是mapper函数所返回的Optional对象本身 |
下面是一个Java案例程序,演示了如何使用上述每个方法:
import java.util.NoSuchElementException;import java.util.Optional;import java.util.function.Predicate;import java.util.function.Supplier;public class OptionalExample { public static void main(String[] args) { // 定义字符串 String value1 = "Hello, world!"; String value2 = null; // 1、创建Optional对象,并将字符串作为包装值 Optional optional1 = Optional.ofNullable(value1); Optional nullOpt = Optional.ofNullable(value2); // 2、创建Optional对象,并将字符串作为包装值。注意这种方式下,value不能为null,否则会抛出NullPointerException Optional optional2 = Optional.of("Hello, Java!"); //value为null,会抛出NullPointerException try { nullOpt = Optional.of(value2); }catch (NullPointerException e){ System.out.println(e); } // 3、创建一个空的Optional对象 Optional optional = Optional.empty(); System.out.println("\n" + optional); // 4、判断Optional对象是否包含非空值 System.out.println("\nIs optional1 present? " + optional1.isPresent()); System.out.println("Is nullOpt present? " + nullOpt.isPresent()); // 5、获取Optional对象中的值,如果不存在则抛出NoSuchElementException异常 String result1 = optional1.get(); System.out.println("\nValue of optional1: " + result1); try { String tempResult = nullOpt.get(); System.out.println("Value of nullOpt: " + tempResult); }catch (NoSuchElementException e){ System.out.println(e); } // 6、获取Optional对象的值,若不存在则返回指定的默认值 String result2 = optional2.orElse("Default Value"); System.out.println("\nValue of optional2: " + result2); String defaultResult = nullOpt.orElse("Default Value"); System.out.println("Value of nullOpt: " + defaultResult); // 7、获取Optional对象的值,若不存在则使用提供的Supplier生成一个新值 Supplier extends String> other = () -> "Generated Value"; String result3 = optional2.orElseGet(other); System.out.println("\nValue of optional2: " + result3); String generatedResult = nullOpt.orElseGet(other); System.out.println("Value of nullOpt: " + generatedResult); // 8、根据条件过滤Optional对象,返回满足条件的Optional对象 Predicate super String> predicate = s -> s.length() > 10; Optional filteredOptional = optional1.filter(predicate); System.out.println("\nFiltered optional1: " + filteredOptional); filteredOptional = nullOpt.filter(predicate); System.out.println("Filtered nullOpt: " + filteredOptional); // 9、将Optional对象中的值转换为mapper函数的结果,并返回新的Optional对象 Optional lengthOptional = optional1.map(String::length); System.out.println("\nLength of optional1: " + lengthOptional.orElse(0)); // 10、类似map操作,返回的是mapper函数所返回的Optional对象本身 Optional flatMappedOptional = optional1.flatMap(s -> Optional.of(s.toUpperCase())); System.out.println("\nFlattened and mapped optional1: " + flatMappedOptional.orElse("")); // 11、如果Optional对象包含值,则执行传入的操作 System.out.println(); optional2.ifPresent(System.out::println); // 12、获取Optional对象的值,若不存在则抛出自定义的异常 try { String result = optional.orElseThrow(() -> new Exception("Exception: Value is not present")); System.out.println("\nValue of optional: " + result); }catch (Exception e) { System.out.println("\n" + e.getMessage()); } }}
运行结果如下:
java.lang.NullPointerExceptionOptional.emptyIs optional1 present? trueIs nullOpt present? falseValue of optional1: Hello, world!java.util.NoSuchElementException: No value presentValue of optional2: Hello, Java!Value of nullOpt: Default ValueValue of optional2: Hello, Java!Value of nullOpt: Generated ValueFiltered optional1: Optional[Hello, world!]Filtered nullOpt: Optional.emptyLength of optional1: 13Flattened and mapped optional1: HELLO, WORLD!Hello, Java!Exception: Value is not present
使用Optional
时可以考虑以下几点优化技巧:
Optional
。Optional
主要用于局部变量和字段,以表明其可能为空;optional.get()
方法获取 Optional
对象的值,可以使用ifPresent()
、orElse()
等更安全的方法来处理值的情况;Optional
,避免过度复杂化逻辑。常见的应用场景包括:
结合实际生产应用来说,Optional在以下业务场景可以发挥重要的作用:
Optional类是一个常规的、泛型化的类,通过包装值的方式来处理可能为空的情况。它采用了一些与空对象模式相关的思想,Optional类提供了一组丰富的操作方法,以便更方便地处理可选值,避免了使用空对象时的空指针异常。
Optional类的设计灵感之一可以类比为空对象模式(Null Object Pattern)。
在空对象模式中,需要处理某个操作的对象可能为空,而使用空对象作为代替,以避免空指针异常。
对于Optional类来说,当value
字段为null时,表示该Optional对象为空,它也被视作特殊的空对象。
Optional类内部有一个私有字段value
,用于存储包装的值。value
字段的类型是泛型T,即可以是任何类型的值。如果Optional对象包含一个非空值,则value
字段存储这个值;如果Optional对象为空,则value
字段为null。
Optional类是Java 8引入的强大工具,用于解决空值处理问题。它可以用于包装可能为空的引用,提供一种更优雅且可读性更高的方式来表示和处理可能为空的值。使用Optional类,我们可以明确表达值是可空的,并通过一系列简单的操作方法来避免潜在的空指针异常。
尽管Optional并不适用于所有情况,但在正确的场景下,它可以大大提高代码的可读性和可维护性。然而,需要谨慎使用Optional,避免过度使用,以免引入额外的复杂性。了解Optional的基础和高级语法、Java操作API以及实现原理等方面的知识,将有助于正确地应用和优化Optional,从而编写更稳健的Java代码。
来源地址:https://blog.csdn.net/LVSONGTAO1225/article/details/131391900
--结束END--
本文标题: 【Java基础教程】(三十一)常用类库篇 · 第一讲:Optional类——解锁Java的Optional操作,消灭那些隐匿的空指针,还程序世界一个安稳!~
本文链接: https://www.lsjlt.com/news/371890.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-04-01
2024-04-03
2024-04-03
2024-01-21
2024-01-21
2024-01-21
2024-01-21
2023-12-23
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0