Java - JDK8 新特性 Optional 使用

简介: Java - JDK8 新特性 Optional 使用


空指针异常是导致Java应用程序失败的最常见原因。以前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码。受到Google Guava的启发,Optional类已经成为Java 8类库的一部分。Optional实际上是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。

  • Optional.of()或者Optional.ofNullable():创建Optional对象,差别在于of不允许参数是null,而ofNullable则无限制
// 参数不能是nullOptional<Integer>optional1=Optional.of(1);
// 参数可以是nullOptional<Integer>optional2=Optional.ofNullable(null);
// 参数可以是非nullOptional<Integer>optional3=Optional.ofNullable(2);
  • Optional.empty():所有null包装成的Optional对象
Optional<Integer>optional1=Optional.ofNullable(null);
Optional<Integer>optional2=Optional.ofNullable(null);
System.out.println(optional1==optional2); // trueSystem.out.println(optional1==Optional.<Integer>empty()); // trueObjecto1=Optional.<Integer>empty();
Objecto2=Optional.<String>empty();
System.out.println(o1==o2); // true
  • isPresent():判断值是否存在
Optional<Integer>optional1=Optional.ofNullable(1);
Optional<Integer>optional2=Optional.ofNullable(null);
// isPresent判断值是否存在System.out.println(optional1.isPresent() ==true);
System.out.println(optional2.isPresent() ==false);
  • ifPresent(Consumer consumer):如果option对象保存的值不是null,则调用consumer对象,否则不调用
Optional<Integer>optional1=Optional.ofNullable(1);
Optional<Integer>optional2=Optional.ofNullable(null);
// 如果不是null, 调用Consumeroptional1.ifPresent(newConsumer<Integer>() {
@Overridepublicvoidaccept(Integert) {
System.out.println("value is "+t);
    }
});
// null, 不调用Consumeroptional2.ifPresent(newConsumer<Integer>() {
@Overridepublicvoidaccept(Integert) {
System.out.println("value is "+t);
    }
});
  • orElse(value):如果optional对象保存的值不是null,则返回原来的值,否则返回value
Optional<Integer>optional1=Optional.ofNullable(1);
Optional<Integer>optional2=Optional.ofNullable(null);
// orElseSystem.out.println(optional1.orElse(1000) ==1); // trueSystem.out.println(optional2.orElse(1000) ==1000); // true
  • orElseGet(Supplier supplier):功能与orElse一样,只不过orElseGet参数是一个对象
Optional<Integer>optional1=Optional.ofNullable(1);
Optional<Integer>optional2=Optional.ofNullable(null);
System.out.println(optional1.orElseGet(() -> {
return1000;
}) ==1); // trueSystem.out.println(optional2.orElseGet(() -> {
return1000;
}) ==1000); // true
  • orElseThrow():值不存在则抛出异常,存在则什么不做,有点类似Guava的Precoditions
Optional<Integer>optional1=Optional.ofNullable(1);
Optional<Integer>optional2=Optional.ofNullable(null);
optional1.orElseThrow(()->{thrownewIllegalStateException();});
try {
// 抛出异常optional2.orElseThrow(()->{thrownewIllegalStateException();});
} catch(IllegalStateExceptione) {
e.printStackTrace();
}
  • filter(Predicate):判断Optional对象中保存的值是否满足Predicate,并返回新的Optional
Optional<Integer>optional1=Optional.ofNullable(1);
Optional<Integer>optional2=Optional.ofNullable(null);
Optional<Integer>filter1=optional1.filter((a) ->a==null);
Optional<Integer>filter2=optional1.filter((a) ->a==1);
Optional<Integer>filter3=optional2.filter((a) ->a==null);
System.out.println(filter1.isPresent()); // falseSystem.out.println(filter2.isPresent()); // trueSystem.out.println(filter2.get().intValue() ==1); // trueSystem.out.println(filter3.isPresent()); // false
  • map(Function):对Optional中保存的值进行函数运算,并返回新的Optional(可以是任何类型)
Optional<Integer>optional1=Optional.ofNullable(1);
Optional<Integer>optional2=Optional.ofNullable(null);
Optional<String>str1Optional=optional1.map((a) ->"key"+a);
Optional<String>str2Optional=optional2.map((a) ->"key"+a);
System.out.println(str1Optional.get()); // key1System.out.println(str2Optional.isPresent()); // false
  • flatMap():功能与map()相似,差别请看如下代码。flatMap方法与map方法类似,区别在于mapping函数的返回值不同。map方法的mapping函数返回值可以是任何类型T,而flatMap方法的mapping函数必须是Optional
Optional<Integer>optional1=Optional.ofNullable(1);
Optional<Optional<String>>str1Optional=optional1.map((a) -> {
returnOptional.<String>of("key"+a);
});
Optional<String>str2Optional=optional1.flatMap((a) -> {
returnOptional.<String>of("key"+a);
});
System.out.println(str1Optional.get().get()); // key1System.out.println(str2Optional.get()); // key1
目录
相关文章
|
5天前
|
Java API 数据安全/隐私保护
探索Java动态代理的奥秘:JDK vs CGLIB
动态代理是一种在 运行时动态生成代理类的技术,无需手动编写代理类代码。它通过拦截目标方法的调用,实现对核心逻辑的 无侵入式增强(如日志、事务、权限控制等)。
31 0
探索Java动态代理的奥秘:JDK vs CGLIB
|
21天前
|
算法 Java 编译器
深入理解 Java JDK —— 让我们从基础到进阶
JDK(Java Development Kit)是 Java 开发的核心工具包,包含编译、运行和调试 Java 程序所需的所有工具和库。它主要由 JVM(Java 虚拟机)、JRE(Java 运行时环境)和 Java 核心类库组成。JVM 是跨平台运行的基础,负责字节码的加载、执行和内存管理;JRE 提供运行 Java 应用的环境;核心类库则提供了丰富的 API 支持。通过编写、编译和运行一个简单的 Java 程序,可以深入理解 JDK 的工作原理。此外,JDK 还提供了 JIT 编译、垃圾回收优化和并发工具包等高级功能,帮助开发者提高程序性能和稳定性。
96 10
|
2月前
|
存储 Java 开发者
什么是java的Compact Strings特性,什么情况下使用
Java 9引入了紧凑字符串特性,优化了字符串的内存使用。它通过将字符串从UTF-16字符数组改为字节数组存储,根据内容选择更节省内存的编码方式,通常能节省10%至15%的内存。
|
2月前
|
容器
jdk8新特性-详情查看文档
jdk8新特性-详情查看文档
62 7
|
2月前
|
存储 Java 数据挖掘
Java 8 新特性之 Stream API:函数式编程风格的数据处理范式
Java 8 引入的 Stream API 提供了一种新的数据处理方式,支持函数式编程风格,能够高效、简洁地处理集合数据,实现过滤、映射、聚合等操作。
92 6
|
3月前
|
Oracle 安全 Java
深入理解Java生态:JDK与JVM的区分与协作
Java作为一种广泛使用的编程语言,其生态中有两个核心组件:JDK(Java Development Kit)和JVM(Java Virtual Machine)。本文将深入探讨这两个组件的区别、联系以及它们在Java开发和运行中的作用。
152 1
|
3月前
|
IDE Java 编译器
开发 Java 程序一定要安装 JDK 吗
开发Java程序通常需要安装JDK(Java Development Kit),因为它包含了编译、运行和调试Java程序所需的各种工具和环境。不过,某些集成开发环境(IDE)可能内置了JDK,或可使用在线Java编辑器,无需单独安装。
125 1
|
3月前
|
分布式计算 Java API
Java 8引入了流处理和函数式编程两大新特性
Java 8引入了流处理和函数式编程两大新特性。流处理提供了一种声明式的数据处理方式,使代码更简洁易读;函数式编程通过Lambda表达式和函数式接口,简化了代码书写,提高了灵活性。此外,Java 8还引入了Optional类、新的日期时间API等,进一步增强了编程能力。这些新特性使开发者能够编写更高效、更清晰的代码。
48 4
|
5月前
|
Java
安装JDK18没有JRE环境的解决办法
安装JDK18没有JRE环境的解决办法
442 3
|
6月前
|
Java 关系型数据库 MySQL
"解锁Java Web传奇之旅:从JDK1.8到Tomcat,再到MariaDB,一场跨越数据库的冒险安装盛宴,挑战你的技术极限!"
【8月更文挑战第19天】在Linux上搭建Java Web应用环境,需安装JDK 1.8、Tomcat及MariaDB。本指南详述了使用apt-get安装OpenJDK 1.8的方法,并验证其版本。接着下载与解压Tomcat至`/usr/local/`目录,并启动服务。最后,通过apt-get安装MariaDB,设置基本安全配置。完成这些步骤后,即可验证各组件的状态,为部署Java Web应用打下基础。
76 1