Heim  >  Artikel  >  Java  >  Optionale Klasse, eine neue Funktion von Java 8

Optionale Klasse, eine neue Funktion von Java 8

黄舟
黄舟Original
2017-02-23 10:30:321837Durchsuche

Zusammenfassung: Optional ist kein Ersatz für das Null-Schlüsselwort, sondern bietet eine elegantere Implementierung der Null-Beurteilung.

NullPointException kann als eine Ausnahme bezeichnet werden, auf die alle Java-Programmierer gestoßen sind, obwohl Java es versucht hat Um Programmierer von den Leiden des Zeigers von Anfang an zu befreien, gibt es tatsächlich Zeiger, und Java-Designer können Zeiger nur einfacher und benutzerfreundlicher in der Java-Sprache machen, aber nicht vollständig. Es wurde eliminiert, daher haben wir die Schlüsselwörter

null

die wir jeden Tag sehen.

Eine Nullzeigerausnahme ist eine Laufzeitausnahme. Wenn es keine klare Behandlungsstrategie gibt, besteht die beste Vorgehensweise darin, das Programm frühzeitig aufhängen zu lassen. In vielen Fällen ist dies jedoch nicht der Fall Sie verfügen über eine bestimmte Behandlungsstrategie, sind sich jedoch der Existenz einer Nullzeigerausnahme überhaupt nicht bewusst. Wenn eine Ausnahme auftritt, ist die Verarbeitungsstrategie ebenfalls sehr einfach. Fügen Sie einfach eine if-Anweisung hinzu, wenn die Ausnahme vorliegt. Eine solche Antwortstrategie führt jedoch dazu, dass in unserem Programm immer mehr Nullurteile angezeigt werden sollte das Vorkommen des Null-Schlüsselworts im Code minimieren, und die von Java8 bereitgestellte Klasse

Optional

reduziert nicht nur NullPointException, sondern verbessert auch die Schönheit des Codes. Zunächst müssen wir jedoch klarstellen, dass es kein Ersatz für das Schlüsselwort ist, sondern eine elegantere Implementierung der Nullbestimmung zur Vermeidung von NullPointException

null
bietet.

1. Intuitive Erfahrung

Angenommen, wir müssen die Länge einer Zeichenfolge zurückgeben. Wenn wir keine Toolklasse eines Drittanbieters verwenden, müssen wir

str.length()
Methode:


if(null == str) { // Nullzeigerbestimmung
return 0;
}
return str.length();
Bei Verwendung der optionalen Klasse lautet die Implementierung wie folgt:

return Optional.ofNullable(str).map(String::length).orElse(0);
Optionaler Code ist relativ prägnanter. Wenn die Codemenge groß ist, vergessen wir leicht, eine Nullprüfung durchzuführen, aber die Verwendung der optionalen Klasse vermeidet solche Probleme.


2. Grundlegende Verwendung

1. Objekterstellung

Leeres Objekt erstellen
Optional74958a288184f4e36b8a117e33be35c9 optStr = Optional.of(str); null, die Throws NullPointException

Objekt erstellen: darf leer sein
Wenn Sie nicht sicher sind, ob der übergebene Parameter die Möglichkeit eines Nullwerts hat, können Sie Optionals verwenden

Die Methode

erstellt ein Objekt. Wenn der Eingabeparameter null ist, wird ein leeres Objekt erstellt. Ein Beispiel ist wie folgt:
ofNullable()

Optionalf7e83be87db5cd2d9a8a0b8117b38cd4 optStr = Optional.ofNullable(str); // Wenn str null ist, erstelle ein leeres Objekt


2 🎜 >

Streaming-Verarbeitung ist auch eine wichtige neue Funktion von Java8, die unseren Sammlungsbetrieb prägnanter und effizienter macht. Der nächste Artikel über die neuen Funktionen von Java8 bietet eine umfassende Einführung in die Abwanderungsverarbeitung. Optional werden hier auch zwei grundlegende Abwanderungsverarbeitungen bereitgestellt: Zuordnung und Filterung.

Zur Demonstration haben wir einen



-Kurs wie folgt entworfen:

User



Mobiltelefon und E-Mail-Adresse sind nicht erforderlich eine Person, daher verwenden wir die optionale Definition.

/**
 * @author: zhenchao.Wang 2016-9-24 15:36:56
 */
public class User {
    /** 用户编号 */
    private long id;
    private String name;
    private int age;
    private Optional<Long> phone;
    private Optional<String> email;
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
    // 省略setter和getter
}

Mapping: Map und FlatMap

Mapping ist eine Operation, die Eingaben in eine andere Ausgabeform umwandelt. Im vorherigen Beispiel geben wir beispielsweise eine Zeichenfolge ein und geben sie aus ist die Länge der Zeichenfolge, was eine Art implizite Reflexion ist. Wir verwenden die Methode


, um dies zu erreichen. Angenommen, wir möchten den Namen einer Person erhalten, dann können wir ihn wie folgt implementieren:

map()
String name = Optional.ofNullable(user).map(User::getName).orElse("no name");

Auf diese Weise wird der Name zurückgegeben, wenn der Eingabeparameter Benutzer nicht leer ist. Andernfalls wird


zurückgegeben. Wenn wir das Telefon oder die E-Mail über die oben beschriebene Methode abrufen möchten, wird der Name zurückgegeben Die obige Methode funktioniert nicht, da nach der Karte „Optional“ zurückgegeben wird, was wir „Optionale Verschachtelung“ nennen. Wir müssen einmal zuordnen, um die gewünschten Ergebnisse zu erhalten:

no name
long phone = optUser.map(User::getPhone) .map( Optional::get).orElse(-1L);

Tatsächlich ist es derzeit eine bessere Möglichkeit, flatMap zu verwenden, um die gewünschten Ergebnisse in einem Schritt zu erhalten:

langes Telefon = optUser.flatMap(User ::getPhone).orElse(-1L);
flapMap kann jeden von der Methode zurückgegebenen Stream in einen Stream zusammenfassen, was im nächsten Artikel zur Stream-Verarbeitung detailliert beschrieben wird.


Filter: Filterer

Filiter ist, wie der Name schon sagt, eine Filteroperation. Wir können die Filteroperation als Parameter an diese Methode übergeben, um den Zweck zu erreichen Filtern. Fügen Sie hinzu, was wir hoffen. Um Erwachsene über 18 Jahre zu überprüfen, können Sie Folgendes implementieren:



3 Verhalten liegt vor, wenn Optional die Bedingungen der durchgeführten Operation nicht erfüllt, wie z. B. das

, das wir im obigen Beispiel verwendet haben
orElse()

就是一个默认操作,用于在Optional对象为空时执行特定操作,当然也有一些默认操作是当满足条件的对象存在时执行的操作。

get()

get用于获取变量的值,但是当变量不存在时则会抛出

NoSuchElementException

,所以如果不确定变量是否存在,则不建议使用

orElse(T other)

当Optional的变量不满足给定条件时,则执行orElse,比如前面当str为null时,返回0。

orElseGet(Supplier<? extends X> expectionSupplier)

如果条件不成立时,需要执行相对复杂的逻辑,而不是简单的返回操作,则可以使用orElseGet实现:

long phone = optUser.map(User::getPhone).map(Optional::get).orElseGet(() -> {
    // do something here
    return -1L;
});
orElseThrow(Supplier<? extends X> expectionSupplier)

与get()方法类似,都是在不满足条件时返回异常,不过这里我们可以指定返回的异常类型。

ifPresent(Consumer117c5a0bdb71ea9a9d0c2b99b03abe3e)

当满足条件时执行传入的参数化操作。

三. 注意事项

Optional是一个final类,未实现任何接口,所以当我们在利用该类包装定义类的属性的时候,如果我们定义的类有序列化的需求,那么因为Optional没有实现Serializable接口,这个时候执行序列化操作就会有问题:

public class User implements Serializable{
    /** 用户编号 */
    private long id;
    private String name;
    private int age;
    private Optional<Long> phone;  // 不能序列化
    private Optional<String> email;  // 不能序列化

不过我们可以采用如下替换策略:

private long phone;
public Optional<Long> getPhone() {
    return Optional.ofNullable(this.phone);
}

看来Optional在设计的时候就没有考虑将它作为类的字段使用~

 以上就是Java8 新特性之 Optional 类 的内容,更多相关内容请关注PHP中文网(www.php.cn)!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn