欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java8 Optional用法

程序员文章站 2022-03-04 11:35:53
...

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");
}
相关标签: java java