在Java8中,引入了一个新的类java.util.Optional ,这个Optional专门用来解决空引用的问题。对于一个方法的返回值什么的,都不需要再判断是不是null了。
package com.ven.java8.Optional;
import java.util.Optional;
/**
* 解析Optional
*
* @author xiaowen
*
*/
public class TestOptional {
public static void main(String[] args) {
// 创建一个对象
SysUser sysUser = new SysUser("xiaowen", "男");
String role = "JAVA IT";
// ***************创建Optional部分 start*******
// 使用of方法创建Optional
Optional<SysUser> optional = Optional.of(sysUser);
Optional<String> optional3 = Optional.of(role);
// Optional<SysUser> optional2 =
// Optional.of(null);//如果传入的参数为null就会出现异常java.lang.NullPointerException
// ofNullable(T)可有任意对象创建对象
// Optional<SysUser> optional3 = Optional.ofNullable(null);
// empty()返回一个空的Optional
// Optional<SysUser> optional4 = Optional.empty();
// ************************创建Optional部分 end******
// ***********************Optional方法的使用******
// get(),获取Optional中的对象
SysUser sysUser2 = optional.get();
System.out.println("对象:" + sysUser2);
// isPresent()判断当前对象是否存在
boolean present = optional.isPresent();// 类似 if(value!=null)
if (present) {
System.out.println("大家好!我是" + sysUser.getName() + "我是一个可爱的boy!");
} else {
new Throwable("出现异常,当前对象为null!");
}
// filter方法,
// 条件判断Optional里面的对象是否满足某一个条件
// 类似 if(value!=null&&value.contains("xiaowen"))
// 源码 接收一个断言接口Predicate参数对象,Predicate
/*
* public Optional<T> filter(Predicate<? super T> predicate) {
* Objects.requireNonNull(predicate); if (!isPresent()) return this;
* else return predicate.test(value) ? this : empty(); }
*/
// optional.filter(x -> x.contains("ab")).ifPresent(x::print);
if (optional.isPresent() && optional.get().getName().equals("xiaowen")) {
System.err.print(optional.get().getName() + "_" + optional.get().getSex());
} else {
System.err.println("该对象不存在该属性!");
}
// map方法 可以对optional里面的对象的值做处理
// 类似于
// if(value!=null){
// String name = name.toLowerCase();
// if(name.length() >1){
// System.out.println(name);
// }
// }
// 转换变量
Optional<String> filter = optional3.map(String::toLowerCase).filter(result -> result.length() > 1);
System.out.print("转换过后的变量:" + filter.get());
// orElse 当Optional里的数据为null,想返回一些默认值
// 类似
// int defaultValue = (x!=null)?x:-1;
String orElse = optional3.orElse("NON");
System.out.println(orElse);
// orElseThrow 值不存在 抛出异常
// 类似
// if (s != null && !s.isEmpty())
// return s;
// else
// throw new IllegalArgumentException();
// }
optional3.filter(s -> !s.isEmpty()).map(s -> s.charAt(0)).orElseThrow(IllegalArgumentException::new);
// 如果SysUser对象里面有一个Address对象,Address里面有addressName属性,这系都有可能为null,在
// java8之前的版本判断是否为null的情况
/*
* public boolean judge(){ if(sysUser!=null){
* if(sysUser.getAddress()!=null){
* if(sysUser.getAddress().getAddressName()!=null){ return true; } }
*
* } return false; }
*/
// 当然也这样判断非空
// return
// sysUser!=null&&sysUser.getAddress()!=null&&sysUser.getAddress().getAddressName()!=null;
//Optional转换为List
/* public static <T> List <T> toList(Optional<T> optional){
return optional.map(Collections::singletonList).orElse(Collections.emptyList());
}*/
}
}