当前位置: 首页 > 后端技术 > Java

使用Optional优雅避免空指针异常

时间:2023-04-02 09:36:10 Java

这篇文章已经收录到Github,推荐阅读,影响不大,也不小。为了解决这个问题,Java8版本中引入了Optional类。Optional类是一个容器对象,它可能包含也可能不包含非空值。使用Optional类可以有效避免空指针异常的问题。在这篇博客中,我将向您介绍JDK可选类以及如何使用它们。Optional简介Optional类是一个容器对象,它可能包含也可能不包含非空值。如果对象可能为空,那么我们可以使用Optional类代替对象。Optional类型的变量可以有两种状态:值存在和值不存在。Optional类有两个重要的方法:of和ofNullable。of方法用于创建一个非空的Optional对象。如果传入参数为null,则会抛出NullPointerException。ofNullable方法用于创建可为空的Optional对象。如果传入参数为空,则返回一个空的Optional对象。当Optional对象有值时,调用get()方法可以返回值;当Optional对象没有值时,调用get()方法会抛出NoSuchElementException异常。以下是使用Optional类的示例:Optionaloptional=Optional.of("HelloWorld");System.out.println(optional.get());//输出HelloWorld在上面的例子中,我们首先使用of()方法创建了一个包含字符串“HelloWorld”的Optional对象,然后使用get()方法获取对象的值并打印出来。请注意,如果我们尝试创建一个具有null值的Optional对象,则会抛出NullPointerException。另外,在使用Optional类时,我们应该尽量避免使用isPresent()和get()方法,因为这些方法可能会导致空指针异常。推荐使用Optional.ofNullable来创建Optional对象。Optional用于创建一个Optional对象我们可以使用以下方法来创建一个Optional对象:Optional.of(value):创建一个包含非空值的Optional对象。Optional.empty():创建一个空的Optional对象,不包含任何值。Optional.ofNullable(value):创建一个可能包含空值的Optional对象。如果value不为null,则该方法创建一个包含该值的Optional对象;否则,创建一个空的Optional对象。以下是使用Optional.ofNullable()方法的示例:Stringstr=null;可选的可选的=Optional.ofNullable(str);System.out.println(optional.isPresent());//上面输出false在例子中,我们首先声明了一个空字符串str,并将其赋值给null。然后,我们使用ofNullable()方法创建了一个Optional对象。由于str为null,因此创建的Optional对象也为空。最后,我们使用isPresent()方法检查Optional对象是否包含值。orElse()和orElseGet()orElse()方法接受一个参数,这是默认值。如果不为空则返回Optional对象中的值,否则返回传入的默认值。具体用法如下:Optionaloptional=Optional.ofNullable(null);Stringresult=optional.orElse("default");System.out.println(result);//output"default"orElseGet()方法和orElse()方法类似,也是用来获取默认值的。而orElseGet()方法接收的参数是一个Supplier函数接口,用于在需要返回默认值时生成值。具体用法如下:Optionaloptional=Optional.ofNullable(null);Stringresult=optional.orElseGet(()->"default");System.out.println(result);//output"default"orElse()和orElseGet()的区别orElse()和orElseGet()很相似,所以有必要把它们分开说说它们的区别。无论Optional对象是否为空,都会执行orElse()方法,因此它总是创建一个新对象。orElseGet()方法只有在Optional对象为空时才会执行,所以可以用来延迟新对象的创建。用个例子感受下:@Testvoidtest(){System.out.println("--------Notnull----------");//不适用于nullStringstr1="hello";Stringresult11=Optional.ofNullable(str1).orElse(get(str1+":orElse()方法被执行"));Stringresult12=Optional.ofNullable(str1).orElseGet(()->get(str1+":orElseGet()方法被执行"));System.out.println(result11);System.out.println(result12);System.out.println("--------如果为空----------");//为空Stringstr2=null;Stringresult21=Optional.ofNullable(str2).orElse(get(str1+":orElse()方法被执行了"));Stringresult22=Optional.ofNullable(str2).orElseGet(()->get(str2+":orElseGet()方法被执行了"));System.out.println(result21);System.out.println(result22);}publicStringget(Stringname){System.out.println(name);返回名称;}输出结果如下:--------如果不为null----------hello:orElse()方法执行hellohello--------如果为null----------hello:orElse()方法被执行null:orElseGet()方法被执行对象,您可以使用orElseGet()方法。否则,如果你想一直创建一个新对象,不管Optional对象是否为空,你可以使用orElse()方法。一般来说还是orElseGet()比较好,个人更推荐使用orElseGet()。map()和flatMap()map()方法接受一个函数作为参数,该函数将应用于Optional对象中的值。如果Optional对象有值,则将该值传递给函数进行转换,否则返回一个空的Optional对象。下面是一个使用map()方法的例子:Stringstr="Hello";Optionaloptional=Optional.of(str);OptionalupperCaseOptional=optional.map(String::toUpperCase);System.out.println(upperCaseOptional.get());//OutputHELLO在上面的例子中,我们首先使用of()方法创建了一个包含字符串“Hello”的Optional对象。然后我们使用map()方法将字符串转换为大写并将结果存储在另一个Optional对象upperCaseOptional中。最后,我们使用get()方法获取upperCaseOptional对象中的值并打印出来。flatMap()方法类似于map()方法,都接受一个函数作为参数。然而,flatMap()方法返回一个Optional类型的值。如果该函数返回一个Optional对象,该方法将“展开”它,否则返回一个空的Optional对象。下面是一个使用flatMap()方法的例子:Stringstr="helloworld";可选的可选的=Optional.of(str);Optionalresult=optional.flatMap(s->{if(s.length()>0)returnOptional.of(s.charAt(0));elsereturnOptional.empty();});System.out.println(result.get());//输出h在上面的示例中,我们首先创建一个包含字符串“helloworld”的Optional对象。然后我们使用flatMap()方法将这个字符串转换为第一个字符,并将结果存储在另一个Optional对象result中。最后,我们使用get()方法获取结果对象中的值并打印出来。filter()filter()方法接受一个谓词(Predicate)作为参数,返回一个Optional类型的值。如果Optional对象有值并且满足谓词的条件,则返回Optional对象;否则返回一个空的Optional对象。下面是一个使用filter()方法的例子:Integernumber=10;Optionaloptional=Optional.of(number);Optionalresult=optional.filter(n->n%2==0);System.out.println(result.isPresent());//输出true在上面的例子中,我们首先创建了一个包含整数10的Optional对象。然后,我们使用filter()方法过滤出这个数字是否为偶数,并将结果存储在另一个Optional对象result中。最后,我们使用isPresent()方法检查结果对象是否存在值。总结Optional类是Java8引入的一个非常有用的特性,通过使用Optional类,我们可以更简洁、安全、轻松地编写Java代码,避免空指针异常等问题。因此,在编写Java代码时,我们应该尽可能使用Optional类来处理可能导致空指针的变量。然而,Optional类并不是万能的,它也有一些缺点。它会增加代码的复杂性和执行时间,因为它要求我们在使用值之前检查它是否存在。因此,在使用Optional类时需要仔细权衡利弊。本文就到此为止,感谢大家的阅读,如果本博客有什么错误或者建议,欢迎大家留言指正。文章持续更新中,大家可以关注公众号第一时间阅读。