选修课 |番石榴 |Java
简介:可选是一个不可变对象,它可能包含对另一个对象的非空引用。这种类型的每个实例要么包含一个非空引用,要么不包含任何内容,在这种情况下,我们说该引用不存在。从来没有说它包含空值。
示例: Hashmap.get(key) 可能会在 Hashmap 中找不到键时返回 null,但如果键存在但值为 null,它也可能返回 null。 Optional 类可用于可能使用空对象的地方。
Optional 类没有构造函数,但提供了3 个公共静态方法来获取该类的实例。
- Optional.fromNullable(T)允许提供 null 或非 null 引用并将其包装在新的 Optional 实例中。
- 如果传入的参数为 null,则该实例没有存储任何引用并且是“不存在”的实例。
- 如果传入的参数不为空,则该非空引用存储在新的 Optional 实例中。
- Optional.of(T)的作用类似于 Optional.fromNullable(T),只是它希望将非空参数传递给它。如果将 null 传递给它,则会引发NullPointerException 。
- 当代码知道将提供给 Optional.fromNullable(T) 的参数为 null 时, Optional.absent()很有用,并且比应该返回 Optional 的“不存在”版本更清楚地表达。
一旦获取了 Optional 的实例,就可以在该实例上调用多个实例方法。例如, Optional.isPresent()方法可用于确定给定的 Optional 实例中是否有非空参数。一旦知道 Optional 实例包含非空引用, Optional.get()方法就会返回存储的非空引用。
注意:如果没有非空引用,则在调用此方法时会引发异常。因此,最好先调用 isPresent()。
宣言 :
@GwtCompatible(serializable = true)
public abstract class Optional
extends Object
implements Serializable
Where, T is the type of instance that can be contained.
可选的类方法:
例子 :
// Java code to show implementation of
// Guava Optional class
import java.util.ArrayList;
import java.util.List;
import com.google.common.base.Optional;
import static com.google.common.base.Strings.emptyToNull;
class GuavaLibrary {
// Driver code
public static void main(String[] args)
{
// Creating a List of Strings
List myList = new ArrayList();
// Adding values to the Strings
myList.add("Geeks");
myList.add("for");
myList.add("GeeksClasses");
myList.add(null);
myList.add("GeeksforGeeks");
myList.add("");
myList.add("Data Structures");
// Displaying values using Java Nulls
displayValuesUsingJavaNulls(myList);
// Displaying values using Guava Optional
displayValuesUsingGuavaOptional(myList);
}
// Method to display values using Java Nulls
public static void displayValuesUsingJavaNulls(List myList)
{
System.out.println("Displaying values using Java Nulls");
// For every String in myList
for (String str : myList) {
if (str == null || str.isEmpty()) {
System.out.println("String : Value is empty or not available");
}
else {
System.out.println("String : " + str);
}
}
System.out.println();
}
// Method to display values using Guava Optional
public static void displayValuesUsingGuavaOptional(List myList)
{
System.out.println("Displaying values using Guava Optional");
// For each String in myList
for (String str : myList) {
Optional optionalName = Optional.fromNullable(emptyToNull(str));
System.out.println("String : " + optionalName.or("String : Value is empty or not available"));
}
}
}
输出 :
Displaying values using Java Nulls
String : Geeks
String : for
String : GeeksClasses
String : Value is empty or not available
String : GeeksforGeeks
String : Value is empty or not available
String : Data Structures
Displaying values using Guava Optional
String : Geeks
String : for
String : GeeksClasses
String : String : Value is empty or not available
String : GeeksforGeeks
String : String : Value is empty or not available
String : Data Structures
下面给出了 Guava Optional Class 提供的一些其他方法:
Guava 可选类与Java.util.Optional
- Guava Optional 类是可序列化的,但Java.util.Optional 不是。
- Java.util.Optional 具有附加方法 ifPresent、filter、flatMap 和 orElseThrow。
- Java.util.Optional 提供了原始专用版本 OptionalInt、OptionalLong 和 OptionalDouble,但 Guava 没有这些版本。
参考:谷歌番石榴