Optional类——Java8新特性
程序员文章站
2022-03-04 10:50:44
...
Optional类
从前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码,受到了Google Guava的启发,Optional类已经成为Java8类库中的一部分。
Optional其实是一个容器,他可以保存T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显示进行空值检测(if(obj!=null){···})
创建Optional
- Optional.of(T value));返回一个Optional描述给指定的非null值
- Optional.ofNullable(T value);返回一个Optional描述的值,如果为空返回一个空的Optional
- Optional.empty();返回一个空的Optional
Employee e1 = new Employee("张三",8000);
Optional<Employee> opt = Optional.ofNullable(e1);
//如果存在,打印employee,不存在返回空的Optional
System.out.println(opt);
判断
返回值 | 方法名 | 说明 |
---|---|---|
boolean | isPresent() | 判断是否包含对象 |
void | ifPresent(Consumer<? super T> action) | 如果有值就执行action,并且该值会作为参数传给它,否则什么都不做 |
void | ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction) | 如果有值就执行给定的操作,否则执行基于空的给定操作**(JAVA9新增)** |
获取
返回值 | 方法名 | 说明 |
---|---|---|
T | get() | 如果调用对象包含值,返回该值,否则抛出异常 |
T | orElse(T other) | 如果有值返回该值,否则返回指定other |
T | orElseGet(Supplier<? extends T> other) | 如果有值返回该值,否则返回由Supplier接口实现提供的对象 |
T | orElseThrow(Supplier<? extends X> exceptionSupplier) | 如果有值返回该值,否则抛出由Supplier接口实现提供的异常 |
Optional | or(Supplier<? extends Optional<? extends T>> supplier) | 如果值存在返回一个Optional描述的值,否则返回一个 Optiona通过供给函数产生**(JAVA9新增)** |
Stream | stream() | 如果有值返回包含该值的Stream,否则返回空Stream**(JAVA9新增)** |
Employee e2 = new Employee();
Optional<String> opt2 = Optional.ofNullable(e2.getName());
//如果有名字,返回他的名字,没有返回“无名氏”
String name = opt2.orElse("无名氏");
System.out.println("这个员工的名字为:"+name);
操作
返回值 | 方法名 | 说明 |
---|---|---|
Optional | filter(Predicate<? super T> predicate) | 如果有值,判断是否符合predicate的条件,否则返回空 |
Optional | map(Function<? super T,? extends U> mapper) | 如果有值,对该值执行Function接口的实现代码,并返回一个Optional的结果,否则报空指针异常 |
Optional | flatMap(Function<? super T,? extends Optional<? extends U>> mapper) | 如果有值,返回基于Optional包含的映射方法的值,否则返回一个空的Optional |
Optional<Employee> opt3 = Optional.of(new Employee("李四",5000));
//如果工资大于10000返回该对象,否则返回空
Optional<Employee> opt33 = opt3.filter(e->e.getSalary()>10000);
System.out.println(opt33);
//为员工工资提高10%(如果opt333不为空)
Optional<Employee> opt333 = opt3.map(e->{e.setSalary(e.getSalary()*1.1);return e;});
System.out.println(opt333);
总结:
- Java8中新增的类
- Optional主要功能实现空指针检测
- 不过这个类中提供了很多实用的扩展方法
- Optional是Java实现函数式编程的强进一步
上一篇: 自定义WPF Popup控件
下一篇: 使用Optional类优化你的代码
推荐阅读