JAVA8 Optional新特性和使用详解
文章目录一、Optional简介二、应用Optional1、创建Optional对象2、Optional中map用法3、Optional其它方法用法三、Optional实战1、创建Optional实例2、默认值前言在介绍Optional之前我们先回顾Stream流中两个方法map和flatMap区别。map只是一维 1对1 的映射而flatmap可以将一个2维的集合映射成一个一维,相当于他映射的深度比map深了一层。说的专业点就是各个流会被合并或者扁平化为一个单一的流。例public static void mapAndFlatMap() { String[] array {HELLO,WORLD}; StreamString stream Arrays.stream(array); ListString collect stream.map(s - s.split()).flatMap(Arrays::stream).collect(toList()); System.out.println(collect); stream Arrays.stream(array); ListStreamString collect1 stream.map(s - s.split()).map(Arrays::stream).collect(toList()); System.out.println(collect1); }运行结果[H, E, L, L, O, W, O, R, L, D] [java.util.stream.ReferencePipeline$Head1218025c, java.util.stream.ReferencePipeline$Head816f27d]一、Optional简介作为java程序员相信大家都遇到过NullPointerException这个异常。这个空指针的由来是1965年英国一位计算机科学家Horae提出来的设计初衷是通过编译器的自动检测机制确保所有使用和引用方法都是绝对安全。在java8汲取了Haskell和Scala的灵感引入了一个新类Optional。变量存在时Optional只是对类简单封装变量不存在时会被建模成空的Optional对象由方法Optional.empty()返回。二、应用Optional在使用之前我们先学习如果创建Optional对象。1、创建Optional对象创建空的Optional对象Optional optCar Optional.empty();创建非空Optional对象Optional optCar Optional.of(obj);可接受null的Optional对象Optional optCar Optional.ofNullable(obj);2、Optional中map用法从对象种提取信息java8之前我们需要这些做。例String name null; if(obj ! null) { name obj.getName(); }但是java8之后我可以用一行代码来完成。OptionalObject optObj Optional.ofNullable(obj); OptionalString name optInsurance.map(Object::getName);3、Optional其它方法用法Optional类中还有许多其它方法我们对它进行分类和概括帮助大家加深印象。方法描述empty返回一个空的Optional实例filter如果只存在并且满足提供的谓词就返回包含该值的Optional对象否则返回一个空的Optional对象flatMap如果只存在就对该值执行提供的mapping函数返回一个Optional类型的值否则返回一个空的Optional对象get如果该值存在将该值用Optional封装返回否则抛出一个NoSuchElementException异常ifPresent如果值存在就返回使用该值的方法调用否则什么也不做isPresent如果值存在就返回true否则返回falsemap如果只存在就对该值执行提供的mapping函数of将执行值用Optional封装返回如果该值是null则抛出NullPointerException异常ofNullable将执行值用Optional封装返回如果该值是null则返回一个空的Optional对象orElse如果有值则将其返回否则返回一个默认值orElseGet如果有值则将其返回否则返回一个指定的Supplier接口生成的值orElse如果有值则将其返回否抛出一个指定的Supplier接口生成的异常三、Optional实战1、创建Optional实例OptionalDish dish1 Optional.of(dish); OptionalDish dish2 Optional.ofNullable(dish);2、默认值OptionalDish dish1 Optional.of(dish).orElse(new Dish());综上所知如果我们想要使用Optional的强大功能可以封装一个工具类OptionalUtil更好的优化我们的代码。