Optional判空

首先需要记住Optional的一些方法


第一批方法:产生Optional对象的方法empty()、of(obj)、ofNullable(obj)

empty() 创建一个空的Optional (如果是空)

Optional <Object> empty = Optional.empty();

of() 创建一个非空的Optional,如果传入的参数是null则抛出NullPointerException

Optional <Object> instance = Optional.of("Mao");

ofNullable() 创建一个可以为空,也可以不是空的Optional对象

Optional <Object> instance1 = Optional.ofNullable(null);
Optional <Object> instance2 = Optional.ofNullable("Mao");

本质上,这三个都是调用了Optional的构造器方法,产生了一个Optional对象。


第二批方法:逻辑判断orElse(obj),orElseGet(Supplier other),orElseThrow(Supplierexception Supplier)

orElse(obj):存在则返回变量值,(传参默认需要传入字符串)否则就抛出错误NoSuchElementException异常

​ 如果value是空则执行orElse中的参数

String lmff = Optional.ofNullable(o).orElse("lmff");

orElseGet(Supplier<? extends T> other): orElse延迟调用版,并且传参可以传入Lambda表达式来实现业务

​ 如果value是空则执行orElseGet中的参数

String lmff = Option.ofNullable(o).orElseGet(() -> {/* code */})

orElseThrow(SupplierException Supplier):异常处理版

Optional.ofNullable(obj).orElseThrow( () -> new ServiceException("该变量值的null!") )

实际意义

当Option.ofNullable(obj)不为null时,执行orElse中的方法(方法引用,Lambda表达式)或者是返回该变量。

而orElseGet是当不为null时,不执行参数中的方法或返回该对象。

而orElseThrow是value为null的时候,直接抛出一个异常

orElse和orElseGet方法之间的区别,orElse就算他不是null,里面的方法还是会先执行一次,orElseGet相当于做了一个优化,如果条件不符合就不会再执行


第三批方法:逻辑判断,isPersent()和ifPersent(Consumer consumer[消费者可用Lambda表达式])可用于判断ofNullable()的参数传入值是否为null

**isPersent()**判断value值是否为空,不为空true,空为false

Optional.ofNullable(obj).isPersent()

**ifPersent()**如果value的值不为空,那就做一些操作

Optional.ofNullable(obj).ifPersent( () -> {} )

第四批方法:值转换,map(Function mapper),flatMap(Function mapper),get()

这两个方法在源码上非常接近,几乎一致,唯一有区别的地方在于他的入参是有所区别的。map的入参为Function<? super T, ? extends U>,而flatMap的入参类型则为Function<? super T,Optional<U>>

map(Function) 可以将一些以对象形式存储的变量转换为其他类型

String catVoice = Optional.ofNullable(cat).map( now -> getVoice() ).get();

flatMap(Function) 同样也可以实现对象类型的一个转换,但他和map有一点点不同,他将所有存储对象的get获得的值都会用Optional的构造函数包裹起来

String catVoicde = Optional.ofNullable(cat).flatMap( now -> getVoice() ).get();

**get()**该方法可以获取Optional对象内部的value值

String temp = Optional.ofNullable("lmff").get();

**第五批方法:**filter(Predicate predicate)

Predicate是指定类型,返回boolean类型的接口

**filter(Predicate predicate)**接收一个Predicate[通过Lambda表达式实现],对Optional中包含的值进行一个过滤处理。

Optional<String> catVoice = Optional.ofNullable(animal).filter.( animal -> animal.getVoice.equals("miao") )

怎么优雅的做判空处理?

场景一(属性判空)
{
	"animal": {
		"cat": {
			"voice": "miao"
		}
	}
}

在对该对象取值的时候,我们需要保证animal存在,保证cat存在,保证voice存在,才能拿到miao,否则就会很容易报空指针错误

面对这种场景,Optional有一套优雅的取值方式

Optional处理(用Stream流表达式挖到底)

String voice = Optional.ofNullable(animal)
						.map( now -> now.getCat())
						.map( now -> now.getVoice())
						.orElseThrow(() -> new Exception("取值错误"));	
场景二(对象判空)

只要user不为空,就将user作为参数传入到方法中,进行使用

原本

if(cat != null) {doSomething(cat);}

Optional处理(判断是否可用)

Optional.ofNullable(cat).ifPersent( now -> doSomething(cat));
场景三(区别操作)

对对象中属性进行判断,如果为null,则进行复制操作,如果不为null则继续走其他业务,大致逻辑可以参考一下的内容

if(cat != null){
	String catVoice = cat.getVoice();
	if("miao".equals(catVoice)){
		return cat;
	}
}else{
	Cat cat = new Cat();
	cat.setName("miao");
	return cat;
}

Optional处理(判断是否可用,并为此赋一些关键值)

Optional
    .ofNullable(cat)
    .filter( now -> now.getVoice.equals("miao") )
    .orElseGet( ()-> {
	Cat cat = new Cat();
	cat.setVoice("miao");
	return cat;
});

附加

Lambda表达式可以用来实现函数式接口,而函数式接口又可以分为几种:1.生产者、2.消费者、3.返回Boolean类型······等等,还可以用来实现方法,进而实现一个接口,做一次性的处理。