介绍
Optional<T>类是一个容器类,代表一个值存在或不存在,原来用null表示一个值不存在,现在Optional可以更好地表达这个概念,并且可以避免空指针异常。
常用API
Optional.of(T t):创建一个Optional实例,若为null,则会引起空指针
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
package com.chentongwei.java8.day06;
import java.util.Optional;
import org.junit.Test;
import com.chentongwei.java8.day05.Employee;
/**
* 测试Optional
*
* @author TongWei.Chen
* @date 2017年4月3日13:25:37
*/
public class TestOptional {
//of
@Test
public void test1() {
Optional<Employee> op = Optional.of(new Employee());
//正常输出
System.out.println(op.get());
Optional<Employee> op1 = Optional.of(null);
//空指针异常
System.out.println(op1.get());
}
//empty
@Test
public void test2() {
Optional<Employee> op = Optional.empty();
//java.util.NoSuchElementException
//不会出现空指针异常
System.out.println(op.get());
}
//ofNullable orElse orElseGet
@Test
public void test3() {
Optional<Employee> op = Optional.ofNullable(new Employee());
//如果有元素,不是空或null
if(op.isPresent()) {
System.out.println(op.get());
}
Employee emp = op.orElse(new Employee("张三"));
System.out.println(emp);
//与orElse区别在于他接收一个函数式接口,可以写自己逻辑,比如if true
//返回A对象,else 返回B对象
Employee emp2 = op.orElseGet(() -> new Employee());
System.out.println(emp2);
}
//map flatMap
@Test
public void test4(){
Optional<Employee> op = Optional.of(new Employee(101, "张三", 18, 9999.99));
Optional<String> op2 = op.map(Employee :: getName);
System.out.println(op2.get());
Optional<String> op3 = op.flatMap((e) -> Optional.of(e.getName()));
System.out.println(op3.get());
}
//需求:获取一个男人心中女神的名字
public String getGodnessName(Man man){
//防止出现空指针异常,需要各种判断
if(man != null){
Godness g = man.getGod();
if(g != null){
return g.getName();
}
}
return "苍老师";
}
@Test
public void test5() {
Man man = new Man();
String name = getGodnessName(man);
System.out.println(name);
}
@Test
public void test6() {
Optional<Godness> godness = Optional.ofNullable(new Godness("林志玲"));
Optional<NewMan> op = Optional.ofNullable(new NewMan(godness));
String name = getGodnessName2(op);
System.out.println(name);
}
public String getGodnessName2(Optional<NewMan> man) {
return man.orElse(new NewMan())
.getGodness()
.orElse(new Godness("苍老师"))
.getName();
}
}
若有兴趣,欢迎来加入群,【Java初学者学习交流群】:458430385,此群有Java开发人员、UI设计人员和前端工程师。有问必答,共同探讨学习,一起进步!
欢迎关注我的微信公众号【Java码农社区】,会定时推送各种干货:
qrcode_for_gh_577b64e73701_258.jpg
网友评论