深入探究 Java 8 新特性:Optional 类
概念说明
在 Java 8 中,引入了许多令人兴奋的新特性,其中之一就是 Optional
类。这个类主要用于解决空指针异常(NullPointerException)的问题,提供了一种更安全和优雅的方式来处理可能为 null
的值。
为什么需要 Optional 类?
在传统的 Java 编程中,我们经常需要检查一个对象是否为 null
,以避免出现空指针异常。这导致了代码的冗余和可读性的降低。Java 8 引入的 Optional
类可以让我们更加优雅地处理可能为 null
的情况,从而减少代码中的条件检查。
类声明
以下是一个 java.util.Optional 类的声明:
public final class Optional<T> extends Object
Optional 类的基本用法
Optional
类是一个容器对象,它可以包含一个非空的值,也可以表示一个为空的值。我们可以使用 Optional.of()
方法创建一个包含非空值的 Optional
对象,或者使用 Optional.empty()
方法创建一个空的 Optional
对象。
下面是一个简单的示例:
Optional<String> optionalValue = Optional.of("Hello, Optional!");//非空值对象
Optional<String> emptyOptional = Optional.empty();//空值对象
如何避免空指针异常?
通过使用 Optional
类,我们可以采用一种更加优雅的方式来避免空指针异常。下面是一个示例:
String name = null;
Optional<String> optionalName = Optional.ofNullable(name);//声明这个对象可能为空
String actualName = optionalName.orElse("Unknown");//指定了对象为空时的默认值
System.out.println("Name: " + actualName);
在上面的示例中,我们使用了 Optional.ofNullable()
方法来创建一个可能为空的 Optional
对象。然后,通过 orElse()
方法,我们指定了在对象为空时的默认值。
如何从 Optional 中获取值?
我们可以使用不同的方法从 Optional
对象中获取值,例如:
get()
:获取值,如果值为空则会抛出异常。orElse(T other)
:获取值,如果值为空则返回指定的默认值。orElseGet(Supplier<? extends T> other)
:获取值,如果值为空则通过 Supplier 返回默认值。orElseThrow(Supplier<? extends X> exceptionSupplier)
:获取值,如果值为空则抛出指定的异常。
Optional 类的链式操作
Optional
类支持链式操作
,这使得我们可以在一系列的操作中处理可能为空的值。例如:
String result = Optional.ofNullable("Hello")
.map(s -> s + ", Optional!")
.orElse("Default Value");
System.out.println(result);
通过链式操作来处理数据,从而降低代码的复杂度,提高代码的可读性和可维护性。
java 中泛型标记符:
E - Element (在集合中使用,因为集合中存放的是元素)
T - Type(Java 类)
K - Key(键)
V - Value(值)
N - Number(数值类型)
? - 表示不确定的 java 类型
Optional类的方法
序号 | 方法 & 描述 |
---|---|
1 | static Optional empty()返回空的 Optional 实例。 |
2 | boolean equals(Object obj)判断其他对象是否等于 Optional。 |
3 | Optional filter(Predicate<? super predicate)如果值存在,并且这个值匹配给定的 predicate,返回一个Optional用以描述这个值,否则返回一个空的Optional。 |
4 | Optional flatMap(Function<? super T,Optional> mapper)如果值存在,返回基于Optional包含的映射方法的值,否则返回一个空的Optional |
5* | T get()如果在这个Optional中包含这个值,返回值,否则抛出异常:NoSuchElementException |
6 | int hashCode()返回存在值的哈希码,如果值不存在 返回 0。 |
7 | void ifPresent(Consumer<? super T> consumer)如果值存在则使用该值调用 consumer , 否则不做任何事情。 |
8* | boolean isPresent()如果值存在则方法会返回true,否则返回 false。 |
9 | Optional map(Function<? super T,? extends U> mapper)如果有值,则对其执行调用映射函数得到返回值。如果返回值不为 null,则创建包含映射返回值的Optional作为map方法返回值,否则返回空Optional。 |
10* | static Optional of(T value)返回一个指定非null值的Optional。 |
11* | static Optional ofNullable(T value)如果为非空,返回 Optional 描述的指定值,否则返回空的 Optional。 |
12* | T orElse(T other)如果存在该值,返回值, 否则返回 other。 |
13 | T orElseGet(Supplier<? extends T> other)如果存在该值,返回值, 否则触发 other,并返回 other 调用的结果。 |
14 | T orElseThrow(Supplier<? extends X> exceptionSupplier)如果存在该值,返回包含的值,否则抛出由 Supplier 继承的异常 |
15 | String toString()返回一个Optional的非空字符串,用来调试 |
注意: 这些方法是从 java.lang.Object 类继承来的。
下面是具体的实例,这个实例来自于菜鸟教程:
public class OptionalDemo {
public static void main(String[] args) {
Integer value1=null;
Integer value2=new Integer(10);
// Optional.of - 如果传递的参数是 null,抛出异常 NullPointerException
Optional<Integer> a = Optional.ofNullable(value1);
Optional<Integer> b = Optional.of(value2);
System.out.println(sum(a,b));
}
public static Integer sum(Optional<Integer> a,Optional<Integer> b){
// Optional.isPresent - 判断值是否存在
System.out.println("第一个参数是否存在"+a.isPresent());
System.out.println("第二个参数是否存在"+b.isPresent());
// Optional.orElse - 如果值存在,返回它,否则返回默认值
Integer value1=a.orElse(new Integer(0));
//Optional.get - 获取值,值需要存在
Integer value2=b.get();
System.out.println(value1);
return value1+value2;
}
}
输出结果如下:
总结
Java 8 引入的 Optional
类为我们提供了一种更加安全和优雅的方式来处理可能为空的值,避免了空指针异常的发生。通过使用 Optional
类,我们可以编写出更加简洁、可读性更高的代码。
作者:Stevedash
发表于:2023年8月18日 19点45分
来源:Java 8 Optional 类 | 菜鸟教程 (runoob.com)