Java之JDK1.8新特性四(Optional类)

Optional类

Optional类(java.util.Optional)是一个容器类,可以用来表示一个对象是否存在。
原来用null表示一个对象是否存在,现在Optional可以更好的表达这个概念,并且可以避免空指针异常。
常用方法

  • static of(T t):创建一个Optional实例
  • static empty():创建一个空的Optional实例
  • static ofNullable(T t):若t不为null,创建Optional实例;否则创建空实例
  • isPresent():调用的容器对象是否包含值
  • orElse(T t):如果调用的容器对象包含值,返回该值;否则返回t
  • orElseGet(Supplier s):如果调用容器对象包含值,返回该值;否则返回s获取的值
  • map(Function f):如果有值对其处理,并返回f处理后的Optional;否则返回Optional.empty()
  • flatMap(Function f):与map类似,但是f处理的返回值要求必须是Optional类型。可以进一步控制空指针异常

示例代码如下:

String s = "hello";
		
//1、创建1个包含指定s对象的容器,如果s为null,会报NullPointerException
Optional<String> op1 = Optional.of(s);
System.out.println(op1.get());

//2、创建一个空容器
Optional<String> op2 = Optional.empty();
//System.out.println(op2.get());//NoSuchElementException(容器中不存在任何对象)

//3、创建1个包含指定s对象的容器,如果s为null,会创建一个空容器
Optional<String> op3 = Optional.ofNullable(s);
System.out.println(op3);

//4、
s = null;
Optional<String> op4 = Optional.ofNullable(s);
if(op4.isPresent()){//判断容器中是否有值
	System.out.println(op4.get());
}

//5、如果op4容器中有对象,返回该对象;如果没有对象,返回指定的"Java"对象
String s2 = op4.orElse("Java");
System.out.println(s2);

//6、如果op4容器中有对象,返回该对象;如果没有对象,返回指定操作获得的对象
String s3 = op4.orElseGet(() -> "JavaSE");
System.out.println(s3);

//7、如果op3容器中有对象,返回处理后的对象;若容器中没有对象,返回一个空容器
Optional<String> nop3 = op3.map(String::toUpperCase);
System.out.println(nop3.get());

//8、如果op4容器中有对象,返回处理后的对象;若容器中没有对象,返回一个空容器
Optional<String> nop4 = op4.flatMap(a -> Optional.of(a.toUpperCase()));
System.out.println(nop4.get());//返回一个空容器

应用演示:
现有2个实体类:

public class Man {
	private Goddess goddess;//女神
	//省略了构造方法、getters、setters和toString方法
}
public class Goddess {
	private String name;
	//省略了构造方法、getters、setters和toString方法
}

//测试类:获取男人心目中女神的名字

public void test(){
	//1)
	Man man = new Man();
	//System.out.println(getGodnessName(man));//NullPointerException
	
	//2)
	System.out.println(getGoddessName2(man));

	//3)
	Optional<Goddess> goddess = Optional.ofNullable(new Goddess("凤姐"));
	Optional<NewMan> op = Optional.ofNullable(new NewMan(goddess));
	System.out.println(getGoddessName3(op));
}

//1)获取女神的名字
public String getGoddessName(Man man){
	return man.getGoddess().getName();
}

//2)获取女神的名字(改进)
public String getGoddessName2(Man man){
	if(man != null){
		Goddess g = man.getGoddess();
		if(g != null){
			return g.getName();
		}
	}
	return "苍老师";
}

//3)获取女神的名字(Optional改进)
//参数op可能没对象,这时候可以通过orElse方法在op容器内创建一个NewMan对象。
//而该NewMan对象的goddess属性可能为null,可以通过orElse进行设置
public String getGoddessName3(Optional<NewMan> op){
	return op.orElse(new NewMan())
			  .getGoddess().orElse(new Goddess("苍老师"))
			  .getName();
}
//NewMan类
public class NewMan {
	//NewMan对象可以没有Goddess,所有可以放入到Optional容器中,避免空指针异常
	private Optional<Goddess> goddess = Optional.empty();
	//省略了构造方法、getters、setters和toString方法
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值