Java8新特性-防止空指针Optional<T> 类

Optional<T> 类(java.util.Optional)是一个容器类,代表一个值存在或不存在,原来用null
表示一个值不存在, 现在 Optional 可以更好的表达这个概念,并且可以避免空指针异常

  常用方法:
  • Optional.of(T t) 创建一个Optional 实例 - t不允许为null

  • Optional.empty() 创建一个空的Optional 实例

  • Optional.ofNullable(T t) 若t不为null,创建Optional 实例,否则创建空实例-Optional.empty。

  • isPresent() : 判断是否包含空值

  • orElse(T t) : 如果调用对象包含值,返回该值,否则返回t

  • orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回s获取的值

  • map(Function f ) ; 如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty()

  • flatMap(Function mapper) : 与map 类似,要求返回值必须是Optional

现有两个类: Man , Godness

package com.java.pojo;

public class Man {

	private Godness godness;

	public Man() {
	}

	public Man(Godness godness) {
		this.godness = godness;
	}

	public Godness getGodness() {
		return godness;
	}

	public void setGodness(Godness godness) {
		this.godness = godness;
	}

	@Override
	public String toString() {
		return "Man [godness=" + godness + "]";
	}

}

package com.java.pojo;

public class Godness {
	private String name;

	public Godness() {
	}

	public Godness(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "Godness [name=" + name + "]";
	}

}

需求: // 需求 获取男人心中女神的名字

	@Test
	public void test5() {
		// 需求 获取男人心中女神的名字
		Man man = new Man();
		String godnessName = getGodnessName(man);
		System.out.println(godnessName);
	}
	// 不使用Optional的普通写法 现在只是两层 如果嵌套几十层,第一阅读性差,第二 性能低下
	private String getGodnessName(Man man) {
		if (man != null) {
			if (man.getGodness() != null) {
				return man.getGodness().getName();
			}
		}
		return "色既是空";
	}

现在进行改造。 Godness类不变。
NewMan:

package com.java.pojo;

import java.util.Optional;

public class NewMan {

	// 有可能没有的值 ,就可以包装在Optional容器里
	private Optional<Godness> godness = Optional.empty();

	public Optional<Godness> getGodness() {
		return godness;
	}

	public void setGodness(Optional<Godness> godness) {
		this.godness = godness;
	}

	public NewMan() {
		super();
	}

	public NewMan(Optional<Godness> godness) {
		super();
		this.godness = godness;
	}

	@Override
	public String toString() {
		return "NewMan [godness=" + godness + "]";
	}

}

	@Test
	public void test6() {
		// 需求 获取男人心中女神的名字
		Optional<NewMan> optional = Optional.ofNullable(new NewMan());
		String godnessName2 = getGodnessName2(optional);
		System.out.println(godnessName2);
	}
	private String getGodnessName2(Optional<NewMan> man) {
		return man.orElse(new NewMan()).getGodness().orElse(new Godness("色即是空")).getName();
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值