Java8 - 学习java.util.Optional类并举例说明

181 阅读3分钟

在这篇博文中,我们将通过实例来学习可选类。

可选类基础知识

在Java应用程序中,许多开发人员在开发过程中会遇到NullPointerException。NullPointerException是一个运行时异常,它破坏了代码。

Java8引入了Optional类来避免空值检查和NullPointerException。

从Java8版本开始,Optional是定义在java.util包中的一个类。

它用于检查值或对象是否存在。

这就避免了空值检查和NullPointerExceptions。可选类是一个容纳值的容器

例如,下面的函数有一个EmpId的参数。这个函数通过调用数据库中的Employee Id来返回雇员对象。

Employee emp=findEmployeeById(1234) { };  
System.out.println("Salary "+emp.getSalary());  

EmployeeId是1234。如果数据库中不存在id=1234的雇员记录,那么它将返回空对象。
emp.getSalary()返回NullPointerException,因为emp对象为空。这是一个常见的问题,开发人员忽略了它,导致应用程序崩溃。
在java8中,Optional类解决了这个问题。我们将重写同样的函数,如下所示

Optional emp=findEmployeeById(1234) { };  
optional.ifPresent(emp -> {  
    System.out.println("Salary= " + emp.getSalary());     
});  

Optional有许多实用的方法来检查对象是否存在。
这里的ifPresent()方法用于检查空值,并在其中使用了lambda表达式。
可选签名

public final class Optional extends Object  

可选实例
我们将通过实例看到可选的方法的各种用法

如何创建空的可选实例?

这个方法返回一个空对象。isPresent()返回false,表示没有值。

Optional str = Optional.empty();  
System.out.println(str.isPresent()); // outputs false  

创建一个非空的可选实例?

Optional.of()方法创建非空值。如果传入空值,在这一行抛出NullPointerException,Optional对象为空。

Optional str = Optional.of("One");  
System.out.println(str.isPresent()); // outputs true  

可选的ofNullable()方法

ofNullable()方法接受空值和非空值。

Optional objOptional= Optional.ofNullable(null);  
System.out.println(objOptional.isPresent()); // outputs false  
Optional strOptional= Optional.ofNullable("One");  
System.out.println(strOptional.isPresent()); // outputs true  

Optional isPresent() method usage isPresent() method returns false - if optional object contains null values, else return true - if contain non null value Optional objOptional= Optional.ofNullable(null);  
System.out.println(objOptional.isPresent()); // outputs false  
Optional strOptional= Optional.ofNullable("One");  
System.out.println(strOptional.isPresent()); // outputs true  

Optional ifPresent() method This method calls specific consumer if the value is presented. Optional str = Optional.of("one");  
str.ifPresent(System.out::println);// This will be called  outputs one  
Optional str1 = Optional.empty();   
str1.ifPresent(System.out::println); // This will not be called as no value preseneted in Optional class  
}  

Optional.get() method This method return value if presented in an optional container else throws NoSuchElementException. Please make sure that before using get() method, first check value is presented or absent using isPresent() Optional emptyOption = Optional.empty();  
Optional strOption = Optional.of("one");  
System.out.println( strOption.get());  
System.out.println( emptyOption.get());  

output is one  
Exception in thread "main" java.util.NoSuchElementException: No value present  
 at java.base/java.util.Optional.get(Optional.java:148)  
 at org.cloudhadoop.defaultmethods.OptionalDemo.main(OptionalDemo.java:31)  

Optional.orElse() method orElse() method is useful to return default value if Optional object is empty if the value is presented, return an optional value Optional str = Optional.of("one"); // Optional contains string value   
System.out.println( str.orElse("defaultvalue")); // Outputs one  
Optional str1 = Optional.empty(); // Empty Optional object  
System.out.println( str1.orElse("defaultvalue")); // defaultvalue is returned  

Optional.orElseGet() method This method returns value if the value is presented, else the supplier is being called and value is returned it Optional emptyOption = Optional.empty();  
Optional strOption = Optional.of("one");  
System.out.println(emptyOption.orElseGet(() -> " optional null orElseGet"));  
System.out.println(strOption.orElseGet(() -> "Optional value orElseGet"));  

Output is  optional null orElseGet  
one
Optional.orElseThrow method This method return value, if the value is presented else supplier is being called and throws an exception Optional emptyOption = Optional.empty();  
Optional strOption = Optional.of("one");  
try {  
    System.out.println( emptyOption.orElseThrow(()->new Exception("Value is not present in Optional")));  
 } catch (Exception e) {  
  e.printStackTrace();  
  }  
  try {  
          System.out.println(strOption.orElseThrow(()->new Exception("Value is not present in Optional")));  
       } catch (Exception e) {  
          e.printStackTrace();  
}  

Output is java.lang.Exception: Value is not present in Optional  
 at org.cloudhadoop.defaultmethods.OptionalDemo.lambda$0(OptionalDemo.java:31)  
 at java.base/java.util.Optional.orElseThrow(Optional.java:397)  
 at org.cloudhadoop.defaultmethods.OptionalDemo.main(OptionalDemo.java:31)  
one  

Optional filter() method This method - if the value is presented and matches given predicate. returning Optional Object else returning empty optional object. Optional strOptional = Optional.of("one two three");  
Optional optionPredicate = strOptional.filter(s -> s.contains("one"));  
optionPredicate.ifPresent(System.out::println);  

Output is Optional map() method if the value is presented. and do the mapping to Function. else returning empty optional object. Optional strOptional = Optional.of("ONETWOTHREE");  
Optional srOptional1 = strOptional.map(String::toLowerCase);  
srOptional1.ifPresent(System.out::println);  

Output is Optional flatMap() method if value is presented. and do the specified optional mapping to Function. else returning empty optional object. Optional strOptional = Optional.of("ONETWOTHREE");  
Optional strOptional1 = strOptional.flatMap(str -> Optional.of(str + " - appendthis"));  
strOptional1.ifPresent(System.out::println);
Output is