回顾以前对null的处理方式
public class OptionalTest {
public static void main(String[] args) {
test01("小黑");
test01(null);
}
public static void test01(String userName) {
if (userName != null) {
System.out.println("用户名为: " + userName);
} else {
System.out.println("用户名为null");
}
}
}
Optional类介绍
Optional是JDK1.8
推出的一个新的类,是一个没有子类的工具类,Optional
可以理解为一个容器,其内部仅能存放一个对象元素或者存放null。它的作用主要就是为了解决避免Null检查,防止NullPointerException。
Optional的基本使用
Optional类的创建方式:
方法 | 说明 |
---|---|
Optional.of(T t) | 创建一个 Optional 实例,内部保存t对象,如果t为null会出现空指针异常 |
Optional.empty() | 创建一个空的 Optional 实例,内部保存null |
Optional.ofNullable(T t) | 若 t 不为 null,创建 Optional 实例,否则创建空实例 |
代码演示:
public static void test02() {
Optional<String> o1 = Optional.of("小马");
// Optional<String> o2 = Optional.of(null); // 如果t为null会出现空指针异常
Optional<String> o3 = Optional.empty();
Optional<String> o4 = Optional.ofNullable(null);
System.out.println("o1 = " + o1);
// System.out.println("o2 = " + o2);
System.out.println("o3 = " + o3);
System.out.println("o4 = " + o4);
}
运行效果:
o1 = Optional[小马]
o3 = Optional.empty
o4 = Optional.empty
Optional类的常用方法:
方法 | 说明 |
---|---|
isPresent() | 判断是否包含值,包含值返回true,不包含值返回false |
get() | 如果Optional有值则将其返回,否则抛出NoSuchElementException |
orElse(T t) | 如果调用对象包含值,返回该值,否则返回参数t |
orElseGet(supplier s) | 如果调用对象包含值,返回该值,否则返回 s 获取的值 |
代码演示:
public static void test03() {
Optional<String> o5 = Optional.of("小马");
Optional<String> o6 = Optional.empty();
Optional<String> o7 = Optional.ofNullable(null);
// isPresent() : 判断是否包含值,包含值返回true,不包含值返回false。
if (o5.isPresent()) {
// get() : 如果Optional有值则将其返回,否则抛出NoSuchElementException。
String userName = o5.get();
System.out.println("用户名o5为:" + userName);
} else {
System.out.println("用户名o5为null");
}
if (o6.isPresent()) {
String userName = o6.get();
System.out.println("用户名o6为:" + userName);
} else {
System.out.println("用户名o6为null");
}
if (o7.isPresent()) {
String userName = o7.get();
System.out.println("用户名o7为:" + userName);
} else {
System.out.println("用户名o7为null");
}
}
运行效果:
用户名o5为:小马
用户名o6为null
用户名o7为null
Optional的高级使用
代码演示:
public static void test04() {
Optional<String> o8 = Optional.of("小程");
Optional<String> o9 = Optional.empty();
// 存在做的什么
o8.ifPresent(s -> System.out.println("用户名o8为" + s));
o9.ifPresent(s -> System.out.println("用户名o9为" + s));
}
public static void test05() {
Optional<String> o10 = Optional.of("小序");
Optional<String> o11 = Optional.empty();
// 如果调用对象包含值,返回该值,否则返回参数
System.out.println("用户名o10为: " + o10.orElse("不存在数据10"));
System.out.println("用户名o11为: " + o11.orElse("不存在数据11"));
// 如果调用对象包含值,返回该值,否则返回参数supplier得到的值
String s10 = o10.orElseGet(() -> {return "未知用户名10";});
System.out.println("s10 = " + s10);
String s11 = o11.orElseGet(() -> {return "未知用户名11";});
System.out.println("s11 = " + s11);
}
运行效果:
用户名o8为小程
用户名o10为: 小序
用户名o11为: 不存在数据11
s10 = 小序
s11 = 未知用户名
总结
Optional
可以理解为一个容器,其内部仅能存放一个对象元素或者存放null。它的作用主要就是为了解决避免Null检查,防止NullPointerException。Optional
的orElse
,ifPresent
,orElseGet
等方法避免对null的判断,写出更加优雅简洁的代码。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。