目录
一:以前对null的处理方式
二:Optional类介绍
三:Optional的基本使用
Optional的高级使用
小结
一:以前对null的处理方式
@Test
public void test01() {
String userName = "凤姐";
// String userName = null;
if (userName != null) {
System.out.println("用户名为:" + userName);
} else {
System.out.println("用户名不存在");
}
}
二:Optional类介绍
Optional
是一个没有子类的工具类,
Optional
是一个可以为
null
的容器对象。它的作用主要就是为了解决避免
Null
检查,防止NullPointerException
。
三:Optional的基本使用
Optional
类的创建方式:
Optional.of(T t) : 创建一个 Optional 实例
Optional.empty() : 创建一个空的 Optional 实例
Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例
Optional
类的常用方法:
isPresent() : 判断是否包含值,包含值返回true,不包含值返回false
get() : 如果Optional有值则将其返回,否则抛出NoSuchElementException
orElse(T t) : 如果调用对象包含值,返回该值,否则返回参数t
orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值
map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()
// Optional类的基本使用
@Test
public void test02() {
// 1.创建Optional对象
// of:只能传入一个具体值,不能传入null
// ofNullable: 既可以传入具体值,也可以传入null
// empty: 存入的是null
Optional<String> op1 = Optional.of("凤姐");
// Optional<String> op1 = Optional.of(null);
// Optional<String> op2 = Optional.ofNullable("如花");
// Optional<String> op2 = Optional.ofNullable("如花");
Optional<Object> op3 = Optional.empty();
// 2.isPresent: 判断Optional中是否有具体值, 有值返回true,没有值返回false
// boolean present = op1.isPresent();
// System.out.println("present = " + present);
// 3.get: 获取Optional中的值,如果有值就返回值具体值,没有值就报错
// System.out.println(op3.get());
if (op1.isPresent()) {
System.out.println(op1.get());
} else {
System.out.println("没有值");
}
}
Optional的高级使用
@Test
public void test03() {
// Optional<String> userNameO = Optional.of("凤姐");
Optional<String> userNameO = Optional.empty();
// orElse: 如果Optional中有值,就取出这个值,如果没有值就使用参数指定的值
String name = userNameO.orElse("如花吗?");
System.out.println("name = " + name);
}
@Test
public void test04() {
Optional<String> userNameO = Optional.of("凤姐");
// Optional<String> userNameO = Optional.empty();
// 存在做的什么
// ifPresent: 如果有值就调用参数
/*userNameO.ifPresent(s -> {
System.out.println("有值: " + s);
});*/
// ifPresentOrElse: 存在做的什么,不存在做点什么
userNameO.ifPresentOrElse(s -> {
System.out.println("有值: " + s);
}, () -> {
System.out.println("没有值");
});
}
@Test
public void test05() {
User u = new User("Hello", 18);
// getUpperUserName1(u);
Optional<User> op = Optional.of(u);
System.out.println(getUpperUserName2(op));
}
// 定义一个方法将User中的用户名转成大写并返回
// 使用Optional方式
public String getUpperUserName2(Optional<User> op) {
/*String upperName = op.map(u -> u.getUserName())
.map(s -> s.toUpperCase())
.orElse("null");*/
String upperName = op.map(User::getUserName)
.map(String::toUpperCase)
.orElse("null");
return upperName;
}
// 定义一个方法将User中的用户名转成大写并返回
// 使用传统方式
public String getUpperUserName1(User u) {
if (u != null) {
String userName = u.getUserName();
if (userName != null) {
return userName.toUpperCase();
} else {
return null;
}
} else {
return null;
}
}
小结
Optional
是一个可以为
null
的容器对象。
orElse
,
ifPresent
,
ifPresentOrElse
,
map
等方法避免对
null
的判断,写出更加优雅的代码。