2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Optional ist eine neue Klasse, die in Java8 eingeführt wurde. Das Hauptproblem, das sie löst, ist NullPointerException.
Übersetzung des Originaltextes (Baidu-Übersetzung, meine Mängel im Englischen): ein Containerobjekt, das Werte ungleich Null enthalten kann oder auch nicht. isPresent() gibt true zurück, wenn der Wert vorhanden ist. Wenn kein Wert vorhanden ist, gilt das Objekt als leer und isPresent() gibt false zurück.
Es werden zusätzliche Methoden bereitgestellt, die vom Vorhandensein des enthaltenen Werts abhängen, z. B. orElse() (gibt den Standardwert zurück, wenn der Wert nicht vorhanden ist) und ifPresent() (führt die Aktion aus, wenn der Wert vorhanden ist).
Dies ist eine wertbasierte Klasse; Programmierer sollten gleiche Instanzen als austauschbar behandeln und keine Instanzen zur Synchronisierung verwenden, da es sonst zu unvorhersehbarem Verhalten kommen kann. Beispielsweise kann die Synchronisierung in einer zukünftigen Version fehlschlagen.
Die Kernfunktion, die ich hier verstehe, ist, dass man bestehen kann isPresent()
Methode, die bei der Beurteilung der Leere des Objekts hilft, und dann bestehenmap()
, orElse()
,ifPresent()
Die Kombination anderer Methoden kann die langwierige Beurteilung im Code erheblich verkürzen.
先介绍一下常用所有的接口;
注意:
1. 此列表是列出了本人觉得有意义的接口不是全部。
2. 当前jdk版本为17,其他版本可能会没有一些方法,例如:`or()` 方法在jdk1.9中增加的
Schnittstellenname | Kurze Funktionsbeschreibung |
---|---|
Optional<T> empty() | Konstruieren Sie ein LeerzeichenOptional Objekt |
Optional<T> of(T value) | Konstruieren Sie ein Nicht-LeerzeichenOptional Einspruch erheben, wenn为空则报错 ! |
Optional<T> ofNullable(T value) | Bau einOptional Objekt, darf leer sein! |
T get() | Rufen Sie einen generischen Objektwert ab, wenn der Wert为空,则报错 |
boolean isPresent() | Wenn nicht, leernull Dann ist estrue |
boolean isEmpty() | Leer wennnull Dann ist estrue |
ifPresent(Consumer) | Übergeben Sie ein Schnittstellenfunktionspaar, wenn die Daten vorliegen不为空 Diese Funktion wird ausgeführt, wenn |
ifPresentOrElse(Consumer, Runnable) | Zwei Parameter, der erste wird ausgeführt, wenn er nicht leer ist, und der zweite wird ausgeführt, wenn er leer ist. Es sind alles Schnittstellenfunktionen. |
Optional<T> filter | Ein Filter für Objekte |
Optional<U> map(Function) | Konvertierungsmethode |
Optional<U> flatMap(Function) | Konvertierungsmethode, die häufig bei der Konvertierung mehrerer Ebenen in eine Ebene verwendet wird |
Optional<T> or(Supplier) | Beim Erhalt des Objekts为空 Beim Erstellen eines neuen basierend auf der SchnittstellenfunktionOptional Objekt |
T orElse(T) | Beim Erhalt des Objekts为空 Ruft ein angegebenes generisches Objekt ab, wenn |
T orElseThrow() | 不为空 Rückgabeobjekt,为空 AberNoSuchElementException |
T orElseThrow(Supplier) | 不为空 Rückgabeobjekt,为空 Aber指定异常 |
下面是常用接口的一些简单的演示
// 1. 构建一个空的 Optional 对象没有任何问题
Optional<Object> empty = Optional.empty();
// 2. 构建一个非空的 Optional 对象没有任何问题
Optional<Object> aa = Optional.of("123");
// 3. 构建一个空的 Optional 对象直接报错 ================ 会报错 of不允许为空
Optional<Object> bb = Optional.of(null);
// 4. 构建一个空的 Optional 对象没有任何问题
Optional<Object> cc = Optional.ofNullable(null);
// 5. 构建一个非空的 Optional 对象没有任何问题
Optional<Object> dd = Optional.ofNullable("123");
Optional<Object> cc = Optional.ofNullable(null);
// 1. 如果为空的时候获取值就会直接报错
Object o = cc.get();
// 2. 如果对象为空,则获取 or 中的 get 方法的值,否则则获取cc的 get 方法中的值
Object o1 = cc.or(() -> Optional.ofNullable("123")).get();
// 3. 如果对象为空,则直接获取的是 123, orElse()中的参数是非空的。 如果对象不为空则直接获取到对象的值
Object o2 = cc.orElse("123");
// 4. 如果对象为空,则获取 or 中的 get 方法的值,否则则获取cc的 get 方法中的值
Object o3 = cc.orElseGet(() -> Optional.ofNullable("123"));
Optional<Object> cc = Optional.ofNullable(null);
// 1. 存在则返回true
boolean present = cc.isPresent();
// 2. 为null返回true
boolean empty = cc.isEmpty();
Optional<Object> cc = Optional.ofNullable(null);
// 1. 如果对象不为空,则执行方法体的内容,否则没有任何操作
cc.ifPresent(item->{
System.out.println("不为空则执行我"+item);
});
// 2. 如果对象不为空,则执行方法体的内容,否则没有任何操作
cc.ifPresentOrElse(item->{
System.out.println("不为空则执行我"+item);
},()->{
System.out.println("为空则执行我");
});
map 方法的使用跟 Stream 中的map方法一样,我的理解这里面的所有的接口方法与 Stream 中重名的用法都是一样的
@Data
public static class User{
private String name;
private Integer age;
}
@Test
void getMapTest(){
User user = new User();
user.setName("123");
Optional<User> optionalUser = Optional.of(user);
// 1. 直接获取 user 对象的 name 的值,这里 map 是当用户不为空的时候执行的
Optional<String> name = optionalUser.map(User::getName);
System.out.println(name.isEmpty()); // 输出 false
Optional<User> optionalUser2 = Optional.ofNullable(null);
// 2. 直接获取 user 对象的 name 的值,这里 map 是当用户不为空的时候执行的
Optional<String> name2 = optionalUser2.map(User::getName);
System.out.println(name2.isEmpty()); // 输出 true
}
Andere Methoden:
filter
: Diese Methode dient zum Filtern,Optional<Path> p = uris. stream().filter(uri -> !isProcessedYet(uri)).findFirst() .map(Paths::get);
Ich habe es hier im Grunde nie verwendet und es scheint, dass es kein Verwendungsszenario gibt.
flatMap
: Ich verstehe diese Methode als Unboxing-Konvertierung: Zum Beispiel put Stream<Optional<T>>
Konvertieren zuOptional<T>
Stream<Optional<T>> os = ....
Stream<T> s = os.flatMap(Optional::stream)
TODO 这里后面再不吧,暂时也没有太合适的例子
Optional
Es wurde in Java 8 eingeführt und bietet eine elegantere und sicherere Möglichkeit, potenziell Nullwerte zu verarbeiten.Hauptsächlich durchor
,orElse
, ifPresent
Wenn Sie darauf warten, dass funktionale Methoden den leeren Raum elegant bestimmen und den Vorgang ausführen, nachdem er nicht leer ist, kann dies mehrere Ebenen reduzierenif
Das Urteilsvermögen macht den Code elegant, aber es gibt auch Nachteile函数式
-Methode verringert die Lesbarkeit des Codes.und müssen es auchLambda
Es erfordert ein gewisses Maß an Verständnis.