📜  选修课 |番石榴 |Java

📅  最后修改于: 2022-05-13 01:55:46.648000             🧑  作者: Mango

选修课 |番石榴 |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 没有这些版本。

参考:谷歌番石榴