java8 Optional的使用
Java8的opitonal使用
一般的我们用 null!=obj 这样的方式去判断对象是否为空,但是如果使用者并不知道调用的函数返回值可能出现null的情况,导致忘记处理为null的情况,那么程序运行的时候就可能出现Null Pointer Exception 空指针异常,opitonal类就是Java提供判断对象是否为空用的一个工具,如果函数使用opitonal当返回值,那么调用者就知道这个方法的返回值有可能出现null的情况,从而去做处理;同时opitonal的存在可以让代码更加简单,可读性跟高,代码写起来更高效.
在了解opitonal之前需要了解四大内置核心函数式接口 https://www.cnblogs.com/lwjQAQ/p/16321930.html
opitonal使用举例: Stream.findOne; Stream.findAll
optional提供三个获取实例的方法。
- empty: 创建一个空的Optional实例
- of: 创建一个Optional值为T的实例,必须不为null 否则直接报错
- ofNullable: 若T不为null,创建Optional 实例,否则创建空实例
复制public static<T> Optional<T> empty() {
Optional<T> t = (Optional<T>) EMPTY;
return t;
}
public static <T> Optional<T> of(T value) {
return new Optional<>(value);
}
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
optional容器类的常用方法
- isPresent() : 判断是否包含值
- orElse(T t) : 如果调用对象包含值,返回该值,否则返回t 默认值
- orElseGet(Supplier s) : 如果调用对象包含值,返回该值,否则返回s获取的值
- map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty()
- flatMap(Function f): 与map类似,要求返回值必须是Optional
- filter(Predicate p): 如果值存在并且满足提供的谓词,就返回包括该值的Optional对象;否则返回一个空的Optional对象
复制 @Test
public void test() {
UserInfo userInfo = null;
Optional<UserInfo> userInfoOptional = Optional.ofNullable(userInfo);
System.out.println(userInfoOptional.isPresent());
if (userInfoOptional.isPresent()) {
System.out.println(userInfoOptional.get());
}
// orElse返回默认值
UserInfo ofElseUser = userInfoOptional.orElse(new UserInfo("罗文杰", 18, "12345"));
System.out.println(ofElseUser);
// 使用Supplier函数返回默认值
UserInfo orElseGetUser = userInfoOptional.orElseGet(() -> new UserInfo("罗文杰", 18, "12345"));
System.out.println(orElseGetUser);
userInfo = new UserInfo("罗文杰", 18, "12345");
userInfoOptional = Optional.ofNullable(userInfo);
// map 重新构造返回值
Optional<Object> optionalMap = userInfoOptional.map(item -> {
item.setAge(24);
return item;
});
if (optionalMap.isPresent()) {
System.out.println(optionalMap.get());
}
// filter过滤
Optional<UserInfo> userInfoOptionalFilter = userInfoOptional.filter(item -> item.getAge() <= 18);
if (userInfoOptionalFilter.isPresent()) {
System.out.println(userInfoOptionalFilter.get());
}
}
@Test
public void test2() {
UserInfo userInfo = null;
Optional<UserInfo> userInfoOptional = Optional.of(userInfo);
if (userInfoOptional.isPresent()) {
System.out.println(userInfoOptional.get());
}
}
@Test
public void test3() {
Optional<UserInfo> userInfoOptional = Optional.empty();
if (userInfoOptional.isPresent()) {
System.out.println(userInfoOptional.get());
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人