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

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

程序员文章站 2022-03-04 11:28:32
...

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();
	}