Optional容器类的常用方法
说明
方法 | 描述 |
---|---|
empty | 放回一个值为空的Optional实例 |
filter | 如果值存在并且满足提供的谓词,就返回包含该Optional对象;否则返回一个空的Optional对象 |
flatMap | 如果值存在,就对该值执行提供的mapping函数,返回mapping函数返回值,flatMap不会使用Optional包装Function执行的返回结果 |
get | 如果值存在就返回该Optional对象,否则就抛出一个 NoSuchElementException异常 |
ifPresent | 如果值存在就对该值执行传入的方法,否则就什么也不做 |
isPresent | 如果值存在就返回true,否则就返回false |
map | 如果值存在,就对该值执行提供的mapping函数调用,将mapping函数返回值用Optional封装并返回 |
of | 如果传入的值存在,就返回包含该值的Optional对象,否则就抛出NullPointerException异常 |
ofNullable | 如果传入的值存在,就返回包含该值的Optional对象,否则返回一个空的Optional对象 |
orElse | 如果值存在就将其值返回,否则返回传入的默认值 |
orElseGet | 如果值存在就将其值返回,否则返回一个由指定的Supplier接口生成的值 |
orElseThrow | 如果值存在就将其值返回,否则返回一个由指定的Supplier接口生成的异常 |
常用示例
// 1、Optional.of(T t): 创建一个Optional实例 不能传null
Optional<Employee> op1 = Optional.of(new Employee());
// 2、Optional.empty():创建一个空的Optional实例
Optional<Employee> op2 = Optional.empty();
// 3、Optional.ofNullable(Tt):若t不为nul1,创建Optional实例,否则创建空实例
Optional<Employee> op3 = Optional.ofNullable(new Employee());
// 4、isPresent():判断是否包含值
if (op3.isPresent()) {
System.out.println(op3.get());
}
// 5、ifPresent(Consumer c):如果值存在就对该值执行传入的方法
op3.ifPresent(System.out::println);
// 6、orElse(Tt):如果调用对象包含值,返回该值,否则返回t
Employee employee = op3.orElse(new Employee(11, "aaaa"));
System.out.println(employee);
Optional.ofNullable(list).orElse(Collections.emptyList());
// 7、orElseGet(Supplier s):如果调用对象包含值,返回该值,否则返回s获取的值
Employee employee2 = op3.orElseGet(() -> new Employee());
System.out.println(employee2);
// 8、map(Function f):如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty()
Optional<Employee> op4 = Optional.ofNullable(new Employee(1, "张三"));
Optional<Integer> map = op4.map(e -> e.getAge());
System.err.println(map.get());
// 9、flatMap(Function mapper):与map类似,要求返回值必须是Optional
Optional<Employee> op5 = Optional.ofNullable(new Employee(1, "张三"));
Optional<String> flatMap = op5.flatMap(e -> Optional.of(e.getName()));
System.err.println(flatMap.get());
admin web服务入口 包含 framework,quartz,generator
framework框架核心 包含 system
system系统模块 包含 common通用工具
generator代码生成 包含 common通用工具
quartz定时任务 包含 common通用工具
common通用工具
common通用工具 --> system系统模块 --> framework框架核心 --> web服务入口
Optional 常用优化代码方式
判空取值优化前
if(null == obj)
if(null == user.getName() || "".equals(user.getName()))
if (order != null) {
Logistics logistics = order.getLogistics();
if(logistics != null){
Address address = logistics.getAddress();
if (address != null) {
Country country = address.getCountry();
if (country != null) {
Isocode isocode = country.getIsocode();
if (isocode != null) {
return isocode.getNumber();
}
}
}
}
}
判空取值优化后
String result = Optional.ofNullable(order)
.flatMap(order->order.getLogistics())
.flatMap(logistics -> logistics.getAddress())
.flatMap(address -> address.getCountry())
.map(country -> country.getIsocode())
.orElse(Isocode.CHINA.getNumber());
不要返回 null
当你不确定你提供的东西,是不是为空的时候,一个好的习惯是不要返回 null,否则调用者的代码将充满了 null 的判断。我们要把 null 消灭在萌芽中。
public Optional<String> getUserName() {
return Optional.ofNullable(userName);
}
尽量的少使用 Optional 的 get 方法
Optional<String> userName = "xjjdog";
String defaultEmail = userName.get() == null ? "":userName.get() + "@xjjdog.cn";
应该修改成这样的方式
Optional<String> userName = "xjjdog";
String defaultEmail = userName
.map(e -> e + "@xjjdog.cn")
.orElse("");
网友评论