简单来说,它是处理空值的一个更好的替代品(警告:乍一看可能并没有那么明显)
基本用法它是一种类型(一个类)——那么,怎么才能创建一个这个类型的实例?
使用下它的三个静态方法就可以了
1 2 3 | public static Optional<String> stringOptional(String input) { return Optional.of(input); } |
简单明了——创建一个包含这个值的Optional包装器。记住——如果这个值是null的话,它会抛出NPE!
1 2 3 4 5 6 | public static Optional<String> stringNullableOptional(String input) { if (!new Random().nextBoolean()) { input = null; } return Optional.ofNullable(input); } |
我个人认为是要更好一点。这样就不会有NPE的风险了——如果输入为null的话,会返回一个空的Optional。
1 2 3 | public static Optional<String> emptyOptional() { return Optional.empty(); } |
如果你真的就是希望返回一个”空”值的话。“空”值并不意味着null。
好吧,那如何去消费/使用Optional呢?1 2 3 4 5 6 7 8 9 | public static void consumingOptional() { Optional<String> wrapped = Optional.of("aString"); if (wrapped.isPresent()) { System.out.println("Got string - " + wrapped.get()); } else { System.out.println("Gotcha !"); } } |
简单的方法就是检查Optional包装器是否真的有值(使用isPresent方法)——你会怀疑这和使用if(myObj != null)相比有什么好处。别担心,这个我会解释清楚的
1 2 3 4 5 6 7 8 | public static void consumingNullableOptional() { String input = null; if (new Random().nextBoolean()) { input = "iCanBeNull"; } Optional<String> wrapped = Optional.ofNullable(input); System.out.println(wrapped.orElse("default")); } |
你可以使用orElse方法,这样万一封装的确实是一个null值的话可以用它来返回一个默认值——它的好处显而易见。在提取出真实值的时候可以避免调用ifPresent方法这样明显多余的方式了。
1 2 3 4 5 6 7 8 9 10 11 12 13 | public static void consumingEmptyOptional() { String input = null; if (new Random().nextBoolean()) { input = "iCanBeNull"; } Optional<String> wrapped = Optional.ofNullable(input); System.out.println(wrapped.orElseGet( () -> { return "defaultBySupplier"; } )); } |
这个我就有点搞不清楚了。为什么有两个同样目的的不同方法?orElse和orElseGet明明可以重载的(同名但不同参数)。
不论如何,这两个方法明显的区别就在于它们的参数——你可以选择使用lambda表达式而不是Supplier的实例来完成这个(一个函数式接口)
为什么使用Optional要比常见的null检查强?欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |