空指针异常非常令人讨厌,因为每个Java开发人员都应该面对至少一次。 随着代码的增长,处理这些空指针异常将变得非常乏味,需要进行大量的空检查。
可选类已在Java 8中引入,以提供用于表示可选值而不使用空引用的类型级别的解决方案。 Java之前的版本8可选类是Google的Guava库的一部分。
让我们来看看一些实现java.util.Optional类
Creating an empty Object
可以通过调用创建空的Optional对象空的Optional类的静态方法。
@Test
public void createEmptyOptional() {
Optional<String> empty = Optional.empty();
assertFalse(empty.isPresent());//Also we can use the opposite one empty.isEmpty() from java 10
}
存在()仅当Optional中的对象不为null时,它将返回true;
Creating Optional class with objects
可选类可以用Optional.of()要么Optional.ofNullable()静态方法
@Test
public void createOptionalObject() {
String title = "Optional";
Optional<String> opt = Optional.ofNullable(title);
assertTrue(opt.isPresent());
String title2 = null;
Optional<String> opt1 = Optional.ofNullable(title2);
assertFalse(opt1.isPresent());
}
Optional.of(标题)如果标题为null,将抛出NullPointerException。
Remove null checks while accessing objects with Optional.ifPresent()
如果发现Optional中包装的Object不为null,它将使我们能够对包装的值运行一些代码。
public void checkOptionalIfPresent() {
Color color = ColorFactoryProvider.getColor("red");
Optional<Color> red = Optional.ofNullable(color);
red.ifPresent(color -> System.out.println(color.getColorCode()));//wrapped code will get executed
Color empty= null;
Optional<Color> emptyColor = Optional.ofNullable(empty);
emptyColor.ifPresent(color -> System.out.println(color.getColorCode()));// wrapped code will not get executed
}
您能看到Optional类如何使我们摆脱null检查,以便如果对象为null时包装的代码将不会执行?
Accessing the Objects from Optional class
Optional类也提供了各种方法。
/*
Optional.get()
It returns the wrapped object.
it throws a no such element exception if the wrapped object is null.
*/
@Test
public void getValue(){
Color color = ColorFactoryProvider.getColor("blue");
Optional<Color> optionalColor= Optional.ofNullable(color);
assertEquals(color, optionalColor.get());
}
/*
Optional.orElse()
It is like assigning default value for the object.
if the wrapped object is null then default value will be returned.
*/
@Test
public void OptionalorElseCheck(){
Color defaultColor = ColorFactoryProvider.getColor("red");
Color blue = ColorFactoryProvider.getColor("blue");
Optional<Color> optionalColor = Optional.ofNullable(blue);
assertEquals(blue, optionalColor.orElse(defaultColor));
Color empty = null;
Optional<Color> emptyColor = Optional.ofNullable(empty);
assertEquals(defaultColor, emptyColor.orElse(defaultColor));
}
我们还有其他一些有用的方法 Optional.orElseGet()-类似于要不然()唯一的区别是它将供应商功能接口作为输入,并且仅当Optional中的包装对象为null时才调用。
Optional.orElseThrow()-类似于要不然()唯一的区别是它将Exception Object作为输入,并且如果Optional中的包装对象为null,它将抛出给定的异常。
因此,请使用Optional类开始重构代码,该类提供了处理Java中null的最佳实践。
For more detailed reference check the official documentation