📜  Java 8 可选类

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

Java 8 可选类

每个Java程序员都熟悉 NullPointerException。它可能会使您的代码崩溃。如果不使用过多的空检查,就很难避免它。因此,为了克服这个问题, Java 8 在Java.util 包中引入了一个新类 Optional。它可以帮助编写简洁的代码,而无需使用太多的空检查。通过使用 Optional,我们可以指定要返回的替代值或要运行的替代代码。这使得代码更具可读性,因为隐藏的事实现在对开发人员可见。

Java
// Java program without Optional Class
 
public class OptionalDemo {
    public static void main(String[] args)
    {
        String[] words = new String[10];
        String word = words[5].toLowerCase();
        System.out.print(word);
    }
}


Java
// Java program with Optional Class
 
import java.util.Optional;
 
public class OptionalDemo {
    public static void main(String[] args)
    {
        String[] words = new String[10];
        Optional checkNull
            = Optional.ofNullable(words[5]);
        if (checkNull.isPresent()) {
            String word = words[5].toLowerCase();
            System.out.print(word);
        }
        else
            System.out.println("word is null");
    }
}


Java
// Java program to illustrate
// optional class methods
 
import java.util.Optional;
 
class GFG {
 
    // Driver code
    public static void main(String[] args)
    {
 
        // creating a string array
        String[] str = new String[5];
 
        // Setting value for 2nd index
        str[2] = "Geeks Classes are coming soon";
 
        // It returns an empty instance of Optional class
        Optional empty = Optional.empty();
        System.out.println(empty);
 
        // It returns a non-empty Optional
        Optional value = Optional.of(str[2]);
        System.out.println(value);
    }
}


Java
// Java program to illustrate
// optional class methods
 
import java.util.Optional;
 
class GFG {
 
    // Driver code
    public static void main(String[] args)
    {
 
        // creating a string array
        String[] str = new String[5];
 
        // Setting value for 2nd index
        str[2] = "Geeks Classes are coming soon";
 
        // It returns a non-empty Optional
        Optional value = Optional.of(str[2]);
 
        // It returns value of an Optional.
        // If value is not present, it throws
        // an NoSuchElementException
        System.out.println(value.get());
 
        // It returns hashCode of the value
        System.out.println(value.hashCode());
 
        // It returns true if value is present,
        // otherwise false
        System.out.println(value.isPresent());
    }
}


输出:

Exception in thread "main" java.lang.NullPointerException

为了避免异常终止,我们使用了 Optional 类。在下面的示例中,我们使用 Optional。因此,我们的程序可以在不崩溃的情况下执行。

上面的程序使用了Optional Class

Java

// Java program with Optional Class
 
import java.util.Optional;
 
public class OptionalDemo {
    public static void main(String[] args)
    {
        String[] words = new String[10];
        Optional checkNull
            = Optional.ofNullable(words[5]);
        if (checkNull.isPresent()) {
            String word = words[5].toLowerCase();
            System.out.print(word);
        }
        else
            System.out.println("word is null");
    }
}
输出
word is null

Optional 是一个容器对象,它可能包含也可能不包含非空值。您必须导入Java.util 包才能使用此类。如果存在值, isPresent()将返回 true,而get()将返回该值。提供了依赖于包含值是否存在的其他方法,例如orElse()如果值不存在则返回默认值, ifPresent()如果值存在则执行代码块。这是一个基于值的类,即它们的实例是:

  • 最终的和不可变的(尽管可能包含对可变对象的引用)。
  • 仅基于 equals() 被视为相等,而不是基于引用相等 (==)。
  • 没有可访问的构造函数。

静态方法:静态方法是Java中无需创建类对象即可调用的方法。它们由类名本身或对该类的对象的引用来引用。

句法 :

public static void geek(String name)
{
 // code to be executed....
}

// Must have static modifier in their declaration.
// Return type can be int, float, String or user-defined data type.

要点:由于静态方法属于类,因此可以在不创建类的对象的情况下调用它们。下面给出了一些关于静态方法的要点:

  • 静态方法与它们所在的类相关联,即即使不创建类的实例也可以调用它们。
  • 它们的设计目的是在从同一类创建的所有对象之间共享。
  • 静态方法不能被覆盖。但是可以重载,因为它们是在编译时由编译器使用静态绑定解决的。

下表显示了 Optional Class 提供的静态方法列表:

实例方法:实例方法是需要在调用它之前创建其类的对象的方法。要调用实例方法,我们必须创建定义它的类的对象。

句法 :

public void geek(String name)
{
 // code to be executed....
}
// Return type can be int, float String or user defined data type.

要点:实例方法可以在它们所在的同一类中调用,也可以从同一包或其他包中定义的不同类中调用,具体取决于提供给所需实例方法的访问类型。下面给出了有关实例方法的一些要点:

  • 实例方法属于类的对象,而不是类,即它们可以在创建类的对象后调用。
  • 从该类创建的每个单独的对象都有它自己的该类的实例方法的副本。
  • 它们可以被覆盖,因为它们是在运行时使用动态绑定解决的。

下表显示了可选类提供的实例方法列表:

具体方法:具体方法是指,该方法具有完整的定义,但可以在继承的类中被覆盖。如果我们将此方法设为final ,则它不能被覆盖。声明方法或类“final”意味着它的实现已经完成。重写抽象方法是强制性的。如果它们不是最终的,则可以在继承的类中覆盖具体方法。下表显示了可选类提供的具体方法列表:

下面给出了一些例子:

示例 1:

Java

// Java program to illustrate
// optional class methods
 
import java.util.Optional;
 
class GFG {
 
    // Driver code
    public static void main(String[] args)
    {
 
        // creating a string array
        String[] str = new String[5];
 
        // Setting value for 2nd index
        str[2] = "Geeks Classes are coming soon";
 
        // It returns an empty instance of Optional class
        Optional empty = Optional.empty();
        System.out.println(empty);
 
        // It returns a non-empty Optional
        Optional value = Optional.of(str[2]);
        System.out.println(value);
    }
}
输出
Optional.empty
Optional[Geeks Classes are coming soon]

示例 2:

Java

// Java program to illustrate
// optional class methods
 
import java.util.Optional;
 
class GFG {
 
    // Driver code
    public static void main(String[] args)
    {
 
        // creating a string array
        String[] str = new String[5];
 
        // Setting value for 2nd index
        str[2] = "Geeks Classes are coming soon";
 
        // It returns a non-empty Optional
        Optional value = Optional.of(str[2]);
 
        // It returns value of an Optional.
        // If value is not present, it throws
        // an NoSuchElementException
        System.out.println(value.get());
 
        // It returns hashCode of the value
        System.out.println(value.hashCode());
 
        // It returns true if value is present,
        // otherwise false
        System.out.println(value.isPresent());
    }
}
输出
Geeks Classes are coming soon
1967487235
true