Java 8 Optional

user.getAddress().getProvince();

Diese Schreibweise kann eine NullPointerException verursachen, wenn der Benutzer null ist. Um dieses Problem zu lösen, wird die folgende Schreibmethode angewendet

if(user!=null){
    Address address = user.getAddress();
    if(address!=null){
        String province = address.getProvince();
    }
}

Diese Art des Schreibens ist relativ hässlich. Um das oben erwähnte hässliche Schreiben zu vermeiden, gestalten Sie das hässliche Design elegant. JAVA8 stellt zur Optimierung dieser Schreibmethode die optionale Klasse zur Verfügung, die im folgenden Text ausführlich erläutert wird.

1、 Optional(Tvalue) empty() of(Tvalue) ofNullable(Tvalue)

Zwischen diesen vier Funktionen besteht ein Zusammenhang, daher werden sie zur Erinnerung zusammengefasst.

of(T-Wert) 

 Wenn Value leer ist, wird weiterhin eine NullPointerException gemeldet.

 Wenn der Wert nicht leer ist, kann das optionale Objekt normal erstellt werden.

leer()

empty()Die Funktion besteht darin, das EMPTY-Objekt zurückzugeben

ofNullable(T-Wert)

Der Unterschied im Vergleich of(T value)besteht darin, dass of(T value) eine NullPointerException meldet, wenn der Wert null ist; ofNullable(T value)es wird keine Ausnahme ausgelöst und ofNullable(T value)direkt ein EMPTYObjekt zurückgegeben.

Ich möchte mich nicht verstecken NullPointerException. Stattdessen muss es sofort gemeldet werden. In diesem Fall wird die Of-Funktion verwendet.

2、 orElse(Tother), orElseGet(Supplier<?extendsT>other) und orElseThrow(Supplier<?extendsX>ExceptionSupplier);

orElseDie Verwendung von und orElseGetist wie folgt, was der Angabe eines Standardwerts entspricht, wenn der Wert null ist:

@Test
public void test() {
    User user = null;
    user = Optional.ofNullable(user).orElse(createUser());
    user = Optional.ofNullable(user).orElseGet(() -> createUser());
    
}
public User createUser(){
    User user = new User();
    user.setName("zhangsan");
    return user;
}

Der Unterschied zwischen diesen beiden Funktionen: Wenn der Benutzerwert nicht null ist, orElseführt die Funktion weiterhin die Methode createUser() aus, orElseGetdie Funktion führt jedoch nicht die Methode createUser() aus.

orElseThrow bedeutet, dass eine Ausnahme direkt ausgelöst wird, wenn der Wert null ist. Die Verwendung ist wie folgt

User user = null;
Optional.ofNullable(user).orElseThrow(()->new Exception("用户不存在"));

3、 map(Function<?superT,?extendsU>mapper)和flatMap(Function<?superT,Optional<U>>mapper)

Es gibt keinen Unterschied zwischen diesen beiden Funktionen im Funktionskörper. Der einzige Unterschied besteht in der Eingabe

public class User {
    private String name;
    public String getName() {
        return name;
    }
}

Zu diesem Zeitpunkt wird der Name wie folgt geschrieben:

String city = Optional.ofNullable(user).map(u-> u.getName()).get();

Für flatMap:

Wenn die Benutzerstruktur wie folgt ist

public class User {
    private String name;
    public Optional<String> getName() {
        return Optional.ofNullable(name);
    }
}

Zu diesem Zeitpunkt wird der Name wie folgt geschrieben:

String city = Optional.ofNullable(user).flatMap(u-> u.getName()).get();

4、 isPresent() und ifPresent(Consumer<?superT>consumer);

isPresentDas heißt, bestimmen Sie, ob der Wert leer ist, und ifPresentführen Sie einige Vorgänge aus, wenn der Wert nicht leer ist.

Optional.ofNullable(user).ifPresent(u->{
    // TODO: do something
});

5、 filter(Predicate<?superT>predicate)

Die Filtermethode akzeptiert ein   optionales Element, um die darin enthaltenen Werte zu filtern. Wenn die enthaltenen Werte die Bedingungen erfüllen, wird dieses optionale Element weiterhin zurückgegeben, andernfalls wird es  Predicate zurückgegeben  .OptionalOptional.empty

Optional<User> user1 = Optional.ofNullable(user).filter(u -> u.getName().length()<6);

Wenn die Länge des Benutzernamens, wie oben gezeigt, weniger als 6 beträgt, wird er zurückgegeben. Wenn es größer als 6 ist, wird ein EMPTY-Objekt zurückgegeben.

Praktischer Nutzen

bisherige Schreibweise

public String getCity(User user)  throws Exception{
        if(user!=null){
            if(user.getAddress()!=null){
                Address address = user.getAddress();
                if(address.getCity()!=null){
                    return address.getCity();
                }
            }
        }
        throw new Excpetion("取值错误"); 
    }

JAVA8-Schreibmethode

public String getCity(User user) throws Exception{
    return Optional.ofNullable(user)//判断是否是null
                   .map(u-> u.getAddress())//不为null 取地址
                   .map(a->a.getCity())//不为null 取城市
                   .orElseThrow(()->new Exception("取指错误"));//为null 报错
}

bisherige Schreibweise

if(user!=null){
    dosomething(user);
}

JAVA8-Schreibmethode

Optional.ofNullable(user)
    .ifPresent(u->{
        dosomething(u);
});

bisherige Schreibweise

public User getUser(User user) throws Exception{
    if(user!=null){
        String name = user.getName();
        if("zhangsan".equals(name)){
            return user;
        }
    }else{
        user = new User();
        user.setName("zhangsan");
        return user;
    }
}

Java8-Schreibmethode

public User getUser(User user) {
    return Optional.ofNullable(user)
                   .filter(u->"zhangsan".equals(u.getName()))
                   .orElseGet(()-> {
                        User user1 = new User();
                        user1.setName("zhangsan");
                        return user1;
                   });
}

Guess you like

Origin blog.csdn.net/weixin_41018853/article/details/125989667