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 EMPTY
Objekt 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);
orElse
Die Verwendung von und orElseGet
ist 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, orElse
führt die Funktion weiterhin die Methode createUser() aus, orElseGet
die 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);
isPresent
Das heißt, bestimmen Sie, ob der Wert leer ist, und ifPresent
fü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 .Optional
Optional.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;
});
}