jdk1.8——Optional类

本文详细介绍了Java 8中Optional类的设计和使用,包括其构造方法、核心方法如of、ofNullable、orElse等,以及如何通过map、flatMap、filter等方法优雅地处理null。通过示例代码展示了Optional如何避免空指针异常,提高代码的可读性和安全性。同时,还提及了高版本JDK中Optional的新增特性,如ifPresentOrElse、isEmpty等方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Optional类可以更友好的处理null问题,将if(xxx == null)等类似代码变得更简洁;

Optional类包含的内容:(jdk1.8)

构造Optional类:

Optional类构造方法都是私有的,只能通过Optional类提供的三个静态方法构造:

  1.  empty():返回一个空值的Optional实例;
  2. of(T value):返回值为value的Optional实例,value为null抛出空指针异常;
  3. ofNullable(T value):返回值为value或者空值的Optional实例,当value为null时相当于empty();

Optional类提供的方法:(jdk1.8)

  • public boolean equals(Object obj)

判断两个Optional是否相等,相等条件:前提两边都是Optional实例,两边值都为空值或者两边值的equals()相等;

  • public String toString()

value是空值返回“Optional.empty”,否则返回“Optional[value值]”;

  • public T get()

返回value的值,value不存在抛出NoSuchElementException异常;

  • public T orElse(T other)

返回value的值,value不存在返回other;

  • public T orElseGet(Supplier<? extends T> other)

返回value的值,value不存在返回指定Supplier接口返回的值,value不存在且supplier为null抛出空指针异常;

  • public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X

返回value的值,value不存在抛出supplier指定的异常,value不存在且supplier为null抛出空指针异常;

  • public boolean isPresent()

判断value值是否存在,存在返回true,不存在返回false;

  • public void ifPresent(Consumer<? super T> consumer)

如果值存在则执行consumer,值存在且consumer为null时抛出空指针异常;

  • public<U> Optional<U> map(Function<? super T, ? extends U> mapper)

对value进行映射,返回映射后的Optional实例,如果mapper返回null则映射为空的Optional实例,mapper为null抛出空指针异常;

  • public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper)

跟map基本一样,不过mapper需返回一个Optional对象,mapper为null或者返回null都将抛出空指针异常;

  • public Optional<T> filter(Predicate<? super T> predicate)

如果值存在并且符合predicate条件则返回当前Optional,否则返回一个空的Optional实例,predicate为null抛出空指针异常;

高版本jdk额外的方法:

  • public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)

jdk9新增,如果值存在则执行action,否则执行emptyAction,值存在且action为null或者值不存在切emptyAction为null都将抛出空指针异常;

  • public boolean isEmpty()

jdk11新增,判断值是否不存在,空值返回true,非空值返回false;(跟isPresent()相反)

  • public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier)

jdk9新增,跟orElseGet基本一样,只是返回值不同,supplier也需返回Optional对象;

  • public T orElseThrow()

jdk10新增,值存在返回该Optional对象,否则返回NoSuchElementException异常;

  • public Stream<T> stream()

jdk9新增,将Optional转换成steam对象;

小demo:

/**
 * 2022年1月6日下午2:25:25
 */
package testOptional;

import java.util.Optional;

/**
 * @author XWF
 *
 */
public class TestOptional {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Optional<String> opt = Optional.empty();
		System.out.println("isEmpty:" + opt.isEmpty());
		System.out.println("isPresent:" + opt.isPresent());
		opt.ifPresentOrElse(x -> System.out.println("opt=" + x), () -> System.out.println("opt不存在"));
		System.out.println(opt.orElse("abc"));
		System.out.println(opt.or(() -> Optional.of("DEF")).map(String::toLowerCase));
		System.out.println("===========================");
		opt = Optional.of("XYZ");
		opt.ifPresent(x -> System.out.println(x + x));
		System.out.println(opt.filter(x -> x.length() > 5));
		System.out.println(opt.filter(x -> x.length() <= 5));
		opt.stream().forEach(System.out::println);
	}

}

执行结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值