Java8 Optional用法

Java8引入的Optional类旨在帮助开发者更好地处理null值,避免出现NullPointerException。它提供了静态方法如ofNullable,以及多种实例方法,如filter、map、ifPresent等,支持函数式编程风格。通过使用Optional,可以在方法链中更优雅地处理可能存在或缺失的值,减少冗余的null检查。

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

Java8新加了一个Optional类,根据文档注释看,这是一个处理null值和non-null值的类,使用这个类,不要再担心出现NPE的问题。
可以把它当作一个工具类使用,不能继承。

三个静态方法:

  • static <T> Optional<T> empty() 返回一个空的Optional。
  • static <T> Optional<T> of(T value) value不能为null。
  • static <T> Optional<T> ofNullable(T value) value为null则返回一个空的Optional。

一般来说,都会使用ofNullable()方法。

实例方法:

  • boolean equals(Object obj)
    虽然接受Object,但下面这样并不相等

    Integer a = 3;
    boolean equals = Optional.ofNullable(a).equals(3);
    

    因为equals中这样判断

    if (!(obj instanceof Optional)) {
        return false;
    }
    
  • Optional<T> filter(Predicate<? super T> predicate)
    接受一个函数式接口Predicate,这个接口接受一个参数,返回boolean类型,根据名字可知,就是一个过滤器,符合条件就返回包含指定值的Optional,不符合就返回空的Optional。

    Integer a = 3;
    Optional.ofNullable(a)
    	.filter(b -> b == 3)
    	.ifPresent(System.out::println);
    
  • <U> Optional<U> flatMap(Function<? super T,Optional<U>> mapper)
    还是接受一个函数式接口Function,这个接口接收参数,返回一个结果,这里返回一个Optional。

    Integer a = 3;
    Optional.ofNullable(a)
    		.flatMap((b -> {
    			int sum = 1 + 2 + b;
    			return Optional.ofNullable(sum);
    		}));
    
  • T get()
    小心使用,如果值存在则返回,如果值不存在,则抛异常NoSuchElementException.

  • void ifPresent(Consumer<? super T> consumer)
    接受一个函数式接口Consumer,当值存在时,处理当前值,不存在,跳过。

  • void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)
    如果存在就执行Cousumer.accept(),不存在就执行Runnable run();

    Integer a = null;
    Optional.ofNullable(a)
    	.ifPresentOrElse(b -> {
    		System.out.println(b);
    	}, () -> {
    		System.out.println("empty");
    	});
    
  • boolean isPresent();
    判断值是否存在,存在为true,否则为false。

  • <U> Optional<U> map(Function<? super T,? extends U> mapper)
    这个和flatMap相似,只是这个返回结果的类型不固定。

    Optional.ofNullable(a)
            .flatMap((b -> {
    			int sum = 1 + 2 + b;
    			return Optional.ofNullable(sum);
    		}))
    		.map(c -> String.valueOf(c))
    		.ifPresent(System.out::println);
    
  • T orElse(T other)
    如果值存在就返回,如果值不存在就返回other

    Integer a = null;
    Optional.ofNullable(a)
       		.orElse(10);
    
  • T orElseGet(Supplier<? extends T> other)
    接受一个函数式接口Supplier,如果值存在就返回,不存在就抛异常。行Supplier的get方法。这个和orElse()的区别就是可以执行方法,orElse()只能返回固定值。

  • T orElseThrow()
    如果值存在就返回,不存在就抛异常NoSuchElementException

  • <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)
    如果值存在就返回,不存在就抛异常。此异常由Supplier.get()返回,算是可以自定义异常。

这个类可以用到方法返回值中,比如dto,service层的返回值,直接返回Optional.ofNullable(value)就好了。调用方接收返回值,也不用再写if(xxx == null)或者if(xxx != null)了。直接

returnVal.ifPresent( val -> {

})

就相当于

if(xxx != null){

}

这样

returnVal.ifPresentOrElse(val -> {
			System.out.println(val);
		}, () -> {
			System.out.println("empty");
		});

就相当于

if(returnVal == null){
	System.out.println(returnVal);
}else{
	System.out.println("empty");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值