在Java中,null代表一个不存在的对象,如果对它进行操作就会抛出java.lang.NullPointerException异常。
NPE(NullPointerException)是调试程序最常见的异常。google一下有很多关于方法到底应该返回null还是new一个空对象的讨论。
类似于scala的scala.Option[T]、Haskell的Data.Maybe,Java 8 引入了java.util.Optional<T>。Opitonal就是一个元素的容器,Java8新添加的很多类或者方法的返回值都使用了Opitonal。Java5的话可以使用
Google Guava的Optional来实现,Java8的Optional的接口跟Guava的Optional很相似。
// 创建Optional
String mayBeNull = null;
Optional<String> opt1 = Optional.of(" Hello, rensanning! ");
Optional<String> opt2 = Optional.ofNullable(mayBeNull);
Optional<String> opt3 = Optional.empty();
// ifPresent
opt1.ifPresent(System.out::println); // " Hello, rensanning! "
opt2.ifPresent(System.out::println);
opt3.ifPresent(System.out::println);
// isPresent
boolean b1 = opt1.isPresent();
boolean b2 = opt2.isPresent();
boolean b3 = opt3.isPresent();
System.out.println(b1 + "\t" + b2 + "\t" + b3); // true false false
// filter
opt1.filter(x -> x.contains("ren"))
.ifPresent(System.out::println); // " Hello, rensanning! "
opt2.filter(x -> x.contains("ren"))
.ifPresent(System.out::println);
opt3.filter(x -> x.contains("ren"))
.ifPresent(System.out::println);
// map
opt1.map(String::trim)
.ifPresent(System.out::println); // "Hello, rensanning!"
// flatMap
Optional<String> lastName = Optional.of("last");
Optional<String> firstName = Optional.of("first");
Optional<String> fullName =
lastName.flatMap(ln -> firstName.map(fn -> String.join(" ", ln, fn)));
System.out.println(fullName.get()); // "last first"
Optional<Integer> len = opt1.map(String::length);
// get
System.out.println(len.get()); // 20
try {
System.out.println(opt2.get());
} catch (Exception e) {
// java.util.NoSuchElementException
e.printStackTrace();
}
// orElse/orElseGet/orElseThrow
int len1 = opt1.map(String::length).orElse(-1);
int len2 = opt2.map(String::length).orElse(-1);
int len3 = opt3.map(String::length).orElseGet(() -> 5*40);
System.out.println(len1 + "\t" + len2 + "\t" + len3); // 20 -1 200
try {
opt3.filter(s -> !s.isEmpty())
.map(s -> s.charAt(0))
.orElseThrow(IllegalArgumentException::new);
} catch (Exception e) {
// java.lang.IllegalArgumentException
e.printStackTrace();
}
// Optional -> List
List<String> list1 = opt1.map(Collections::singletonList)
.orElse(Collections.emptyList());
System.out.println(list1.get(0));// " Hello, rensanning! "
// OptionalInt/OptionalLong/OptionalDouble
OptionalInt optionalInt = OptionalInt.of(90);
System.out.println(optionalInt.getAsInt()); // 90
OptionalLong optionalLong = OptionalLong.of(999_999_999_999_999_999L);
System.out.println(optionalLong.getAsLong()); // 999999999999999999
OptionalDouble optionalDouble = OptionalDouble.of(56.000009);
System.out.println(optionalDouble.getAsDouble()); // 56.000009
参考:
http://www.importnew.com/6675.html
http://blog.informatech.cr/2013/04/10/java-optional-objects/
分享到:
相关推荐
Java8新特性之Lambda表达式和Optional类
关于Java8新特性Optional类的详细解读.rar
Java 判空 Optional 详解
Morphia/Jackson Java 8 可选示例Morphia (mongoDB) 和 Jackson (JSON) 序列化都可以用来序列化/反序列化新的 Java 8 Optional 类型。 对于 Jackson,您只需要注册 JDK8 模块。 对于 Morphia,您需要为 Optional ...
本篇文章主要给大家分析了JAVA中Optional类用法以及代码分析,跟着小编学习下吧。
我们知道 Java 8 增加了一些很有用的 API, 其中一个就是 Optional,下面这篇文章主要给大家介绍了关于如何正确使用Java8中Optional机制的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来...
Java8Optional机制的正确使用方式共6页.pdf.zip
java8中optional相关类和java.util.function中的接口函数打成的jar包,有这些可以使用function中的函数接口和optional优雅的处理空指针,用法和java8中类一样,只是包名换成了com.example.rxjavademo
java8新特性Optional深度解析.docx
Java8Optional机制的正确使用方式共6页.pdf.zip
主要给大家介绍了关于Java如何使用Optional与Stream取代if判空逻辑(JDK8以上)的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
2 Optional类 20 2.1 创建Optional容器 21 2.2 容器简单方法 22 2.3 容器进阶方法 23 1.3.5 ifPresent方法 23 1.3.6 orElseGet和orElseThrow方法 23 1.3.7 filter方法 24 1.3.8 map方法 24 1.3.9 flatMap方法 25 2.4...
Optional可以让你的代码具有可读性,且会避免出现空指针异常。下面这篇文章主要给大家介绍了关于利用Java8 Optional如何避免空指针异常的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。
尚硅谷_Java8新特性_Optional 容器类 ·16. 尚硅谷_Java8新特性_接口中的默认方法与静态方法 ·17. 尚硅谷_Java8新特性_传统时间格式化的线程安全问题 ·18. 尚硅谷_Java8新特性_新时间与日期 API-本地时间与时间戳...
该书由 Mario Fusco、Alan Mycroft 和 Raoul-Gabriel Urma 合著,旨在帮助读者深入了解 Java 8,并掌握其中的关键...其他新特性: 简要介绍 Java 8 中引入的其他新特性,如接口的默认方法、方法引用、Optional 类型等。
在UserService类中定义了一个findByName()方法,用来根据用户名查找对应的用户信息,并返回一个Optional类型的结果。在main()方法中创建了一个UserService对象,并演示了如何调用findByName()方法来查询用户信息。...
使用场景:开发和面试题中都会用到,开发中合理运用Java 8新特性可以大大简化代码量,提高开发效率,在Java面试中JDK8新特性也是面试常问的热点题目,理解这些特性之后,很容易把它们说清楚,面试嘎嘎加分 ...