Java Optional

原文:https://www.studytonight.com/java-8/java-optional-class

在 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()等。

| 方法 | 描述 | | 公共静态可选空()</t> | 它返回一个空的可选对象。此可选参数没有值。 | | 公共静态可选的(T 值)</t> | 它返回一个具有指定的当前非空值的可选值。 | | 公共静态可选缺省值(T 值)</t> | 它返回描述指定值的可选值,如果非空,则返回空可选值。 | | 公共 T get() | 如果此可选中存在值,则返回该值,否则引发 NoSuchElementException。 | | 公共布尔值 isPresent() | 如果存在值,则返回 true,否则返回 false。 | | 公共无效 ifPresent(消费者 super T>消费者) | 如果存在值,则使用该值调用指定的使用者,否则不执行任何操作。 | | 公共可选过滤器(谓词 super T>谓词) | 如果存在值,并且该值与给定的谓词匹配,则返回描述该值的可选值,否则返回空的可选值。 | | 公共可选映射(功能 super T,? extends U>映射器)</u> | 如果存在值,则将提供的映射函数应用于该值,如果结果为非空,则返回描述结果的可选值。否则,返回空的可选值。 | | 公共可选平面图(功能 super T,Optional映射器)</u></u> | 如果存在一个值,将提供的带有可选值的映射函数应用于它,返回该结果,否则返回一个空的可选值。 | | 公共信托基金(其他) | 如果存在,则返回该值,否则返回其他值。 | | 公共测试或获取(供应商 extends T>其他) | 如果存在,它返回值,否则调用其他并返回该调用的结果。 | | 公共 T orElseThrow(供应商 extends X>exception Supplier)throw X extends throw able | 它返回包含的值(如果存在),否则抛出一个由提供的供应商创建的异常。 | | 公共布尔等于(对象对象) | 指示某个其他对象是否“等于”此可选对象。另一个对象被认为是相等的,如果:

  • 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);
    }
}

可选【罗汉】 可选。空