Java8特性之Optional类

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/a549654065/article/details/90322546

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


常用方法:

Optional.of(T t) : 创建一个 Optional 实例

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

Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例

isPresent() : 判断是否包含值

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

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

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

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


1)Optional.of(T t) : 创建一个 Optional 实例

示例:

public class Employee {

	private Integer id;
	private String name;
	private Integer age;
	private double salary;
	private Status Status;
	public enum Status{
		FREE,
		BUSY,
		VOCATION;
	}
    //...省略 getter/setter、toString、构造器方法
}

@Test
public void test() {
	Optional<Employee> optional = Optional.of(new Employee());
	Employee emp = optional.get();
	System.out.println(emp);
}

输出:

Employee [id=null, name=null, age=null, salary=0.0, Status=null]

但是注意:如果传入的值是null,则会报空指针异常的错误。


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

示例:

public class Employee {

	private Integer id;
	private String name;
	private Integer age;
	private double salary;
	private Status Status;
	public enum Status{
		FREE,
		BUSY,
		VOCATION;
	}
    //...省略 getter/setter、toString、构造器方法
}	

@Test
public void test() {
	Optional<Employee> optional = Optional.empty();
	System.out.println(optional.get());
}

上述运行会报错,原因是创建了一个空的Optional,使用空对象调用get()方法自然就报错了。


3)

Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例

isPresent() : 判断是否包含值

示例:

public class Employee {

	private Integer id;
	private String name;
	private Integer age;
	private double salary;
	private Status Status;
	public enum Status{
		FREE,
		BUSY,
		VOCATION;
	}
    //...省略 getter/setter、toString、构造器方法
}

@Test
public void test() {
	Optional<Employee> optional_1 = Optional.ofNullable(null);
	Optional<Employee> optional_2 = Optional.ofNullable(new Employee());
	if (optional_1.isPresent()) {
		System.out.println("optional_1:"+optional_1.get());
	}
	if (optional_2.isPresent()) {
		System.out.println("optional_2:"+optional_2.get());
	}
}

输出:

optional_2:Employee [id=null, name=null, age=null, salary=0.0, Status=null]

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

示例:

public class Employee {

	private Integer id;
	private String name;
	private Integer age;
	private double salary;
	private Status Status;
	public enum Status{
		FREE,
		BUSY,
		VOCATION;
	}
    //...省略 getter/setter、toString、构造器方法
}

@Test
public void test() {
    // 
	Optional<Employee> optional = Optional.ofNullable(null);
	Employee emp = optional.orElse(new Employee("张三",17,1888));
	System.out.println(emp);
}

输出:

Employee [id=null, name=张三, age=17, salary=1888.0, Status=null]

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

示例:

public class Employee {

	private Integer id;
	private String name;
	private Integer age;
	private double salary;
	private Status Status;
	public enum Status{
		FREE,
		BUSY,
		VOCATION;
	}
    //...省略 getter/setter、toString、构造器方法
}

@Test
public void test() {
	Optional<Employee> optianal = Optional.ofNullable(null);
	Employee emp = optianal.orElseGet(() -> new Employee());
	System.out.println(emp);
}

输出:

Employee [id=null, name=null, age=null, salary=0.0, Status=null]

orElseGet方法的参数是一个Supplier ,前面的一篇 Java8特性之内置函数式接口 ,我们已经讲过了Supplier ,这是一个供给型接口,用于生成对象。


6)

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

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

这两个的使用方法跟Stream的map() 、flatMap方法类似,这里不做赘述,可以看之前的博客Java8特性之Stream流

猜你喜欢

转载自blog.csdn.net/a549654065/article/details/90322546