通过实例学习java8中的Optional类。
什么是java中的可选类
在Java应用程序中,许多开发人员在开发过程中会遇到NullPointerException 。NullPointerException ,这是一个运行时异常,会破坏代码。
Java8引入了Optional 类来避免空值检查和NullPointerException 。
Optional是自Java8版本以来定义在java.util包中的一个类。
它用于检查values 或object 是否存在。
它避免了空值检查和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 有许多实用的方法来检查对象是否存在。这里 方法检查null值。并在其中使用了lambda表达式。
ifPresent()
下面是一个可选的签名
public final class Optional extends Object
可选实例
我们将通过实例看到可选方法的各种用法。
如何创建一个空的可选实例?
这个方法返回一个空对象。isPresent() ,返回false,表示没有值。
Optional str = Optional.empty();
System.out.println(str.isPresent()); // outputs false
如何创建一个非空的可选实例?
Optional.of() 方法创建非空值。如果传入null, ,在这一行抛出, 对象为空。NullPointerException Optional
import java.util.Optional;
public class OptionalClassExample {
public static void main(String[] args) {
Optional str = Optional.of("One");
System.out.println(str.isPresent()); // outputs true
}
}
可选的ofNullable()方法
ofNullable() 方法接受空值和非空值。
import java.util.Optional;
public class OptionalClassExample {
public static void main(String[] args) {
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 usageisPresent() method returns false - if optional object contains null values, else return true - if contain non null valueimport java.util.Optional;
public class OptionalClassExample {
public static void main(String[] args) {
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 exampleThis method calls a specific consumer if the value is presented.import java.util.Optional;
public class OptionalClassExample {
public static void main(String[] args) {
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 exampleget() method return value if presented in an optional containerelse throws NoSuchElementException.Please check value is presented or absent using isPresent() before using get() method.import java.util.Optional;
public class OptionalClassExample {
public static void main(String[] args) {
Optional emptyOption = Optional.empty();
Optional strOption = Optional.of("one");
System.out.println( strOption.get());
System.out.println( emptyOption.get());
}
}
output: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 examplesorElse() method is useful to return default value if Optional object is emptyif the value is presented, return an optional valueimport java.util.Optional;
public class OptionalClassExample {
public static void main(String[] args) {
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 exampleorElseGet() method returns the value if the value is presented, else the supplier is being called and the value is returned it.import java.util.Optional;
public class OptionalClassExample {
public static void main(String[] args) {
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: optional null orElseGet
one
Optional orElseThrow method exampleorElseThrow method return value, if the value is presented else supplier is being called and throws an exception.import java.util.Optional;
public class OptionalClassExample {
public static void main(String[] args) {
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: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 exampleThis method filter is used to filter the list of records.if the value is presented and matches the given predicate. returning Optional Objectelse returning the empty optional object.import java.util.Optional;
public class OptionalClassExample {
public static void main(String[] args) {
Optional strOptional = Optional.of("one two three");
Optional optionPredicate = strOptional.filter(s -> s.contains("one"));
optionPredicate.ifPresent(System.out::println);
}
}
Output:Optional map() method exampleif the value is presented. and do the mapping to Function.else returning empty optional object.import java.util.Optional;
public class OptionalClassExample {
public static void main(String[] args) {
Optional strOptional = Optional.of("ONETWOTHREE");
Optional srOptional1 = strOptional.map(String::toLowerCase);
srOptional1.ifPresent(System.out::println);
}
}
Output:Optional flatMap() method with exampleflatMap() is similar to map() in functional programming.if the value is presented. and do the specified optional mapping to Function.else returning empty optional object.Here is an java flatMap exampleimport java.util.Optional;
public class OptionalClassExample {
public static void main(String[] args) {
Optional strOptional = Optional.of("ONETWOTHREE");
Optional strOptional1 = strOptional.flatMap(str -> Optional.of(str + " - appendthis"));
strOptional1.ifPresent(System.out::println);
}
}
Output: