引言
本文主要介绍 Java 8 的新特性中 Optional 类的介绍。
本质上,这是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空。
Optional 是 Java 实现函数式编程的强劲一步,并且帮助在范式中实现。但是 Optional 的意义显然不止于此。
测试用例
of 方法
该方法通过一个非 null 的 value 来构造一个 Optional,返回的 Optional 包含了 value 这个值。对于该方法,传入的参数一定不能为 null,否则便会抛出 NullPointerException
Optional<String> of_out = Optional.of("name"); System.out.println(of_out.get());
ofNullable 方法
该方法和 of 方法的区别在于,传入的参数可以为 null
Optional<String> ofNullable_out = Optional.ofNullable(null); System.out.println(ofNullable_out);
empty 方法
该方法用来构造一个空的 Optional,即该 Optional 中不包含值
System.out.println(Optional.empty());
ifPresent 方法
判断是否为null 如果不为空,则进行()操作;反之,则什么都不做
Optional.ofNullable(null).ifPresent(name -> { System.out.println("new string"); });
orElse 方法
如果 Optional 中有值则将其返回,否则返回 orElse 方法传入的参数
Optional<String> orElse_out = Optional.ofNullable(null); System.out.println(orElse_out.orElse("other string"));
orElseGet 方法
orElseGet与orElse方法类似,区别在于得到的默认值 orElseGet方法可以接受Supplier接口的实现用来生成默认值
UserInfo user = (UserInfo) Optional.ofNullable(null).orElseGet(() -> new UserInfo("other", "other name")); System.out.println(user.getUserName());
isPresent 方法
判断值是否为null, 如果值存在返回true,否则返回false
Optional<String> name = Optional.of("name"); if (name.isPresent()) { System.out.println(name.get()); }
orElseThrow 方法
如果有值则将其返回,否则抛出supplier接口创建的异常
try { String text = Optional.ofNullable("this is text").orElseThrow(() -> new Exception("出现错误啦")); System.out.println(text); } catch (Exception ex) { System.out.println(ex.getMessage()); }
map 方法
如果有值,则对其执行调用mapping函数得到返回值。如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,否则返回空Optional
Optional<String> username = Optional.ofNullable(new UserInfo("userId", "userName")).map(u -> u.getUserName()).map(y-> y.toUpperCase()); System.out.println("Username is: " + username.orElse("Unknown"));
flatMap 方法
flatMap 要求参数中的函数 mapper 输出的就是 Optional
Optional<String> u_name = Optional.ofNullable(new UserInfo("userId", "userName")).flatMap(u -> Optional.of(u.getUserName())); System.out.println("Username is: " + u_name.orElse("Unknown"));
filter 方法
Optional<UserInfo> filter_user = Optional.ofNullable(new UserInfo("userId", "userName")) .filter(u -> u.getUserId().equals("userId")); System.out.println("user is: " + filter_user.orElse(null).toString());
Optional 应该怎样用
在使用 Optional 的时候需要考虑一些事情,以决定什么时候怎样使用它。
重要的一点是 Optional 不是 Serializable。因此,它不应该用作类的字段。
如果你需要序列化的对象包含 Optional 值,Jackson 库支持把 Optional 当作普通对象。也就是说,Jackson 会把空对象看作 null,而有值的对象则把其值看作对应域的值。这个功能在 jackson-modules-java8 项目中。