Java Optional
类
在 Java 8 中,Java 在 java.util 包中增加了一个新的类Optional
。这个类用于管理和控制 Java 中的 NullPointerException。由于未初始化的对象或空指针,空指针异常是日常编程中最常见的异常。
由于此异常,我们的程序异常终止,程序导致意外输出。
为了处理这种情况,Java 提供了Optional
类,它是一个容器对象,可以包含也可以不包含非空值。它提供了许多检查空值或非空值的方法,并使我们的程序NullPointerException
免费。
你可以通过这个写在 Java 8 之前的例子来理解这种情况,由于未初始化的变量导致程序终止,抛出NullPointerException
。
示例:不带Optional
类
当我们创建一个变量但忘记初始化它时,但当我们使用它时,这是很常见的。它不起作用并终止程序。
public class Main {
String name; // uninitialized variable
public static void main(String[] args){
Main m = new Main();
/*
*
* tons of line of code
*
*/
// fetching name in somewhere in the code.
char ch = m.name.charAt(0);
System.out.println(ch); // NullPointerException
}
}
线程“main”中出现异常 java.lang.NullPointerException
示例:带有Optional
类
在这个例子中,我们使用Optional
类来检查变量是否为空。为了检查,我们使用了isPresent()
方法,如果变量不为空,该方法返回真。
import java.util.Optional;
public class Main {
String name; // uninitialized variable
public static void main(String[] args){
Main m = new Main();
/*
*
* tons of line of code
*
*/
// fetching name in somewhere in the code.
// Handling null using Optional class
Optional<String> isNull = Optional.ofNullable(m.name);
if(isNull.isPresent()) {
char ch = m.name.charAt(0);
System.out.println(ch); // No NullPointerException
}else {
System.out.println("Value is null");
}
}
}
值为空
可选声明
public final class Optional<T> extends Object
可选方法
下表包含Optional
类的方法,如 empty(),of(),offNullable()等。
| 方法 | 描述 |
| 公共静态
- It is also optional and.
- The value or does not exist in both instances;
Present values are "equal" to each other through equals ().
| | public int hashCode() | 它返回当前值的哈希代码值(如果有),如果没有值,则返回 0(零)。 | | 公共字符串 toString() | 它返回一个适合调试的非空字符串表示形式。确切的呈现格式未指定,可能因实现和版本而异。 |
示例:isPresent()和 ifPresent()
让我们创建另一个例子来理解isPresent()
和ifPresent()
方法。这两种方法都属于Optional
类,如果变量不为空,isPresent()方法返回 true,如果变量不为空,ifPresent()方法仅执行,否则不执行任何操作。
import java.util.Optional;
public class Main {
String name; // uninitialized variable
public static void main(String[] args){
Main m = new Main();
m.name = "Rohan"; // Initializing variable
Optional<String> name = Optional.ofNullable(m.name);
if(name.isPresent()) {
char ch = m.name.charAt(0);
System.out.println(ch); // No NullPointerException
}else {
System.out.println("Value is null");
}
// ifPresent()
name.ifPresent(n -> {
System.out.println("Value is present");
System.out.println("Value start with "+ m.name.charAt(0));
}
);
}
}
R 值存在 值以 R 开始
示例:orElse()方法
如果变量为空,则使用orElse()
方法返回指定值。这个方法用来为变量设置一个替代值,这样如果一个变量是空的,那么我们就可以得到一个指定的值,而不是空值。
import java.util.Optional;
public class Main {
public static void main(String[] args){
Optional<String> name = Optional.of("Rohan");
Optional<String> lName = Optional.empty();
// orElse
String other = name.orElse("Sohan");
System.out.println(other);
// empty
other = lName.orElse("Sohan");
System.out.println(other);
}
}
Rohan Sohan
示例:orElseGet()
orElseGet()
方法类似于orElse()
方法,除了它允许调用一个实现,如 lambda 表达式或函数。请看下面的例子。
import java.util.Optional;
public class Main {
static String otherVal() {
return "Value not Present";
}
public static void main(String[] args){
Optional<String> name = Optional.of("Rohan");
Optional<String> lName = Optional.empty();
// orElseGet
String other = name.orElseGet(() -> otherVal());
System.out.println(other);
// empty
other = lName.orElseGet(() -> otherVal());
System.out.println(other);
}
}
罗汉 值不存在
示例:过滤器()方法
filter()
方法返回一个可选值,并以谓词作为参数。所以我们可以像下面的例子一样,通过一个 lambda 表达式来过滤结果。
import java.util.Optional;
public class Main {
public static void main(String[] args){
Optional<String> name = Optional.of("Rohan");
Optional<String> lName = Optional.empty();
// filter
Optional <String> other = name.filter(n->n.equals("Rohan"));
System.out.println(other);
other = name.filter(n->n.equals("rohan"));
System.out.println(other);
}
}
可选【罗汉】 可选。空