Java新特性之Optional类

什么是Optional类

   Optional
类是Java8引入的新类,所在类库是 java.util.Optional<T>
。Optional 是个容器,可以存储类型为 T
的值,也可以存储为null的对象,也就是说,即使对象为null,也不报 java.lang.NullPointerException
空对象异常。

为什么要Optional类

  从上面就可以看出,该类就是为了解决臭名昭著的空对象异常而生。

如何使用Optional类

提供的方法

方法 说明
**static
Optional empty()**
返回空的 Optional 实例。
boolean equals(Object obj) 判断其他对象是否等于 Optional。
**Optional
filter(Predicate<? super predicate)**
如果值存在,并且这个值匹配给定的 predicate,返回一个Optional用以描述这个值,否则返回一个空的Optional。
**
Optional
flatMap(Function<? super T,Optional > mapper)**

如果值存在,返回基于Optional包含的映射方法的值,否则返回一个空的Optional
T get() 如果在这个Optional中包含这个值,返回值,否则抛出异常:NoSuchElementException
int hashCode() 返回存在值的哈希码,如果值不存在 返回 0。
void ifPresent(Consumer<? super T> consumer) 如果值存在则使用该值调用 consumer , 否则不做任何事情。
boolean isPresent() 如果值存在则方法会返回true,否则返回 false。
**
Optional map(Function<? super T,? extends U> mapper)**
如果有值,则对其执行调用映射函数得到返回值。如果返回值不为 null,则创建包含映射返回值的Optional作为map方法返回值,否则返回空Optional。
**static
Optional of(T value)**
返回一个指定非null值的Optional,value为null则直接抛出空对象异常。
**static
Optional ofNullable(T value)**
如果为非空,返回 Optional 描述的指定值,否则返回空的 Optional。
T orElse(T other) 如果存在该值,返回值, 否则返回 other,可以视为默认值。
T orElseGet(Supplier<? extends T> other) 如果存在该值,返回值, 否则触发 other(一个Lambda表达式),并返回 other 调用的结果。
** T orElseThrow(Supplier<? extends X> exceptionSupplier)** 如果存在该值,返回包含的值,否则抛出由 Supplier 继承的异常
String toString() 返回一个Optional的非空字符串,用来调试

实例

import java.util.Optional;

public class Test9 {
	public static void main(String[] args) {
	
		//如果为非空,返回 Optional 描述的指定值,否则返回空的 Optional。
		Optional<Object> a = Optional.ofNullable(null);
		Test9.test(a);
		
		//值为null则直接抛出空对象异常
		Optional<String> b = Optional.of("yes");
		Test9.test(b);
	}

	public static <T> void test(Optional<T> t) {

		if (t.isPresent()) {// 该值是否存在,否则为null
			T s = t.get();
			System.out.println("获取到的值:"+s);
		} else {
			System.out.println("值为空!");
		}

		//如果存在该值,返回值, 否则返回Lambda表达式的结果。
		System.out.println(t.orElseGet(() -> {
			return (T) "Lambda表达式返回值!";
		}));

		//如果存在该值,返回值, 否则返回Lambda表达式的结果。
		System.out.println(t.orElse((T) "我是默认值-1!"));
		
		System.out.println(t.map(s -> "值是: " + s + "!/n").orElse("我是默认值-2!/n"));

	}

}

输出结果

值为空!
Lambda表达式返回值!
我是默认值-1!
我是默认值-2!

获取到的值:yes
yes
yes
值是: yes!

参考文献

Java 8 新特性

Java 8新特性终极指南

原文 

https://www.huangdayu.cn/2019/04/13/Java新特性之Optional类/

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Java新特性之Optional类

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址