Optional是java8出现的特性,对函数式编程有着极好的帮助.Optional是一个包装类,是对普通类的包装,可以有效解决nullpointException
构造方法
private Optional() {this.value = null;}public static<T> Optional<T> empty() {@SuppressWarnings("unchecked")Optional<T> t = (Optional<T>) EMPTY;return t;}private Optional(T value) {this.value = Objects.requireNonNull(value);}
所有的构造方法均被定义为private,阻止了通过构造创建Optional.因为Optional不支持序列化,所以不建议用来修饰类的成员变量.最好将Optional作为方法的返回值.
常用方法
静态方法构造
- empty():Optional
调用私有构造方法,返回一个空的Option
public static<T> Optional<T> empty() {@SuppressWarnings("unchecked")Optional<T> t = (Optional<T>) EMPTY;return t;}
- of(T):
传一个非空的value,返回这个对象的Optional包装.如果value为空会报错
public static <T> Optional<T> of(T value) {return new Optional<>(value);}
- ofNullable(T)
如果不确定value是否为空,使用该方法
public static <T> Optional<T> ofNullable(T value) {return value == null ? empty() : of(value);}
常用方法
取值方式
- get():T //如果Optional对象有值取值,为空会报错,配合isPresent()使用
- isPresent():boolean
- ifPresent(Consumer<? super T>):void //如果Optional对象有值执行Consumer生成的实例,无值不执行
- orElse(T):T //如果Optional对象有值返回值,无值返回传入的形参对象
- orElseGet(Supplier<? extends T>):T //若Optional对象有值返回值,无值返回调用Supplier生成的实例。
链式方法
- filter(Predicate<? super T> predicate):Optional
- map(Function<? super T, ? extends U> mapper):Optional
- flatMap(Function<? super T, Optional> mapper): Optional
下列的例子将一个字符串类型的数字转化为数字,并输出.如果字符串为null,则不执行输出//用Optional包装一个字符串Optional<String> num = Optional.ofNullable("123");/*将num容器中的值解析为数字,并将结果用Optional包装.如果numString为空,就调用empty()方法直接返回生成的空的Optional*/Optional<Integer> numInteger = numString.map(value -> Integer.parseInt(value));//如查numInteger不为空,就执行输出,如果为空,不执行numInteger.ifPresent(value-> System.out.println(value));//可以简写为://函数式编程//String s="123";String s=null;Optional.ofNullable(s).map(Integer::parseInt).ifPresent(System.out::println);//上述代码可以分为三部分:入口,链式,出口
参考文档: https://blog.csdn.net/xiliunian/article/details/88738747
