Heim  >  Artikel  >  Java  >  Was sind die häufig verwendeten optionalen Methoden in Java?

Was sind die häufig verwendeten optionalen Methoden in Java?

王林
王林nach vorne
2023-05-09 11:34:072819Durchsuche

Vorwort

Optional ist in Java ein Containerobjekt, das einen Wert ungleich Null enthalten oder leer sein kann. Sein Hauptzweck besteht darin, Nullzeigerausnahmen beim Schreiben von Code zu vermeiden.

Die vollständige Verwendung von Optional in Java 8 ist wie folgt:

1. Optionales Objekt erstellen

Sie können ein optionales Objekt mit Nicht-Null-Werten über die of()-Methode erstellen, zum Beispiel:

Optional<String> optional = Optional.of("value");

Das können Sie Erstellen Sie auch ein optionales Objekt über die ofNullable()-Methode, das einen Wert enthält, der leer sein kann, zum Beispiel:

Optional<String> optional = Optional.ofNullable(null);

2 Holen Sie sich den Wert des optionalen Objekts

Sie können den Nicht-Null-Wert im optionalen Objekt über get abrufen ()-Methode, zum Beispiel:

String value = optional.get();

Wenn der Wert im optionalen Objekt leer ist, löst der Aufruf der get()-Methode eine NoSuchElementException aus. Daher ist es am besten, vor dem Aufruf der get()-Methode die isPresent()-Methode zu verwenden, um zu bestimmen, ob das optionale Objekt einen Wert ungleich Null enthält.

3. Bestimmen Sie, ob das optionale Objekt einen Nicht-Null-Wert enthält

Sie können die Methode isPresent() verwenden, um zu bestimmen, ob das optionale Objekt einen Nicht-Null-Wert enthält, zum Beispiel:

if (optional.isPresent()) {
    // Optional对象包含非空值
} else {
    // Optional对象为空
}

Sie können auch ifPresent verwenden ()-Methode, wenn das optionale Objekt einen Nicht-Null-Wert enthält. Führen Sie einige Operationen aus, wie zum Beispiel:

optional.ifPresent(value -> System.out.println(value));

4 Rufen Sie den Wert oder Standardwert im optionalen Objekt ab.

Sie können die orElse()-Methode verwenden, um den Wert oder abzurufen Standardwert im optionalen Objekt, wie zum Beispiel:

String value = optional.orElse("default");

Wenn der Wert im optionalen Objekt leer ist, wird der angegebene Standardwert zurückgegeben.

5. Rufen Sie den Wert im optionalen Objekt ab oder lösen Sie eine Ausnahme aus.

Sie können die Methode orElseThrow() verwenden, um den Wert im optionalen Objekt abzurufen oder eine Ausnahme auszulösen, zum Beispiel:

String value = optional.orElseThrow(() -> new RuntimeException("value is null"));

Wenn der Wert im optionalen Das Objekt ist leer. Die angegebene Ausnahme wird ausgelöst.

6. Konvertieren Sie den Wert im optionalen Objekt

Sie können die Methode map() verwenden, um den Wert im optionalen Objekt in einen anderen Werttyp umzuwandeln, zum Beispiel:

Optional<Integer> optional = Optional.of("123").map(Integer::parseInt);

Wenn der Wert im optionalen Objekt leer ist , geben Sie ein optionales Nullobjekt zurück.

7. Filtern Sie den Wert im optionalen Objekt

Sie können die Methode filter() verwenden, um den Wert im optionalen Objekt zu filtern, zum Beispiel:

Optional<String> optional = Optional.of("value").filter(value -> value.startsWith("v"));

Wenn der Wert im optionalen Objekt die angegebenen Filterbedingungen nicht erfüllt wird ein leeres optionales Objekt zurückgegeben.

Java 9-Verbesserungen

Wir haben die Funktionen von Java 8 eingeführt. Java 9 fügt der optionalen Klasse drei Methoden hinzu: or(), ifPresentOrElse() und stream(). Die

or()-Methode ähnelt orElse() und orElseGet() darin, dass beide alternative Fälle bereitstellen, wenn das Objekt leer ist. Der Rückgabewert von or() ist ein weiteres optionales Objekt, das vom Parameter „Supplier“ erzeugt wird.

Wenn das Objekt einen Wert enthält, wird der Lambda-Ausdruck nicht ausgeführt:

@Test
public void whenEmptyOptional_thenGetValueFromOr() {
    User result = Optional.ofNullable(user)
      .or( () -> Optional.of(new User("default","1234"))).get();

    assertEquals(result.getEmail(), "default");
}

Wenn im obigen Beispiel die Benutzervariable null ist, wird eine Option zurückgegeben, die das Benutzerobjekt enthält, dessen E-Mail „Standard“ ist. Die Methode ifPresentOrElse() erfordert zwei Parameter: einen Consumer und einen Runnable. Wenn das Objekt einen Wert enthält, wird die Aktion des Verbrauchers ausgeführt, andernfalls wird das Runnable ausgeführt.

Wenn Sie eine bestimmte Aktion ausführen möchten, wenn ein Wert vorhanden ist, oder einfach verfolgen möchten, ob ein bestimmter Wert definiert ist, ist diese Methode sehr nützlich:

Optional.ofNullable(user).ifPresentOrElse( u -> logger.info("User is:" + u.getEmail()),
  () -> logger.info("User not found"));

Ergänzung: Optionale Kontroverse

In der Tat, ob Sie Optional verwenden sollten oder nicht, es gibt in der Branche immer noch viele Kontroversen. Einerseits kann Optional Entwickler dazu zwingen, mit Nullwerten umzugehen, andererseits ist Optional sehr leicht zu missbrauchen. Insbesondere rufen einige Entwickler get auf () oder ifPresent() Methode nach dem Erhalten der Optional , was kaum Probleme löst und den Codierungsaufwand erhöht.

Mein Vorschlag ist also: Wenn Sie nicht wissen, ob Sie Optional verwenden sollen, verwenden Sie es noch nicht.

Hier sind einige Referenzszenarien für die Verwendung von Optional:

    Optional wird im Allgemeinen für Rückgabewerte verwendet.
  1. Optional wird hauptsächlich für Rückgabewerte verwendet und wird nicht für die Verwendung in Mitgliedsvariablen oder Methodenparametern empfohlen.


  2. Optional selbst beurteilt nicht null. Weisen Sie optional niemals null zu und beurteilen Sie nicht, ob optional selbst null ist. Dies liegt daran, dass es keinen Sinn ergibt, das Problem von null zu lösen zum Konsens der Branche werden.

  3. Sammlungen verwenden kein Optional
  4. Da Sammlungen über bessere Verarbeitungsmethoden wie Collections.emptyList() verfügen, besteht keine Notwendigkeit, Optional zu verwenden.

  5. Funktionale Verarbeitung von Werten
  6. Wie Sie der obigen Einführung in die Verwendung entnehmen können, bietet Optional viele Lambda-Funktionsverarbeitungsmethoden wie Filter, Zuordnung usw. Diese werden bei Verwendung von Optional eher empfohlen, da Optional Ihnen bei der automatischen Verarbeitung helfen kann Nullwertsituationen, um NPE-Ausnahmen zu vermeiden.

  7. Mehrschichtige Attributerfassung
  8. Ich habe dieses Codebeispiel bereits erwähnt. Ich denke, dass dies das Szenario ist, in dem die Vorteile der Verwendung von Optional am offensichtlichsten sind.

  9. Null nicht zurückzugeben ist besser als optional zurückzugeben.
  10. Die Rückgabe von Optional an den Aufrufer zwingt den Aufrufer, mit der Null-Situation umzugehen, was für den Aufrufer zu einer gewissen Codierungslast führt, insbesondere bei Funktionen mit hoher Wiederverwendbarkeit.
  11. Aber wenn der Aufrufer in den meisten Fällen nicht erwartet, null zu erhalten, sollte er eine Methode implementieren, die entweder einen Wert oder eine Ausnahme zurückgibt, wie folgt:



    /**
     * 查询订单,要么返回订单,要么异常
     */
    public Order getOrderByIdOrExcept(Long orderId){
        Order order = orderMapper.getOrderById(orderId);
        if(order == null){
            throw new BizException("根据单号" + orderId + "未查询到订单!");
        }
        return order;
    }
     
    /**
     * 查询订单,值可能为null
     */
    public Optional<Order> getOrderById(Long orderId){
        Order order = orderMapper.getOrderById(orderId);
        return Optional.ofNullable(order);
    }

    Da der nachfolgende Verarbeitungscode auf Bestelldaten basiert, kann die Bestellung nicht ausgeführt werden erhalten werden Daten und Code können nicht ausfallen, daher ist es in den meisten Fällen besser, die Methode getOrderByIdOrExcept zu verwenden, die NPE vermeidet und den Codierungsaufwand erhöht!

Das obige ist der detaillierte Inhalt vonWas sind die häufig verwendeten optionalen Methoden in Java?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen