描述
Optional
类旨在解决空指针异常问题,它是一个可以为null的容器对象。如果值存在则isPresent()
方法会返回true,调用get()
方法会返回该对象。
避免空指针异常
普通写法
public String getName(User user) {
return user != null ? user.getName() : null;
}
public void processName(User user) {
String name = getName(user);
if(name != null) {
log.info("hello" + name);
} else {
log.info("user not found");
}
}
Opational写法
public Optional<String> getName(User user) {
return Optional.ofNullable(user).map(User::getName);
}
public void processName(User user) {
getName(user).ifPresent(
name -> log.info("hello" + name)
);
getName(user).orElseThrow(() -> new UserNotFoundException("User not found."));
}
链式调用
根据一个对象的值决定是否继续调用链上的其他方法时,Optional可以让你的代码更加流畅:
public void processUser(User user) {
Optional.ofNullable(user)
.filter(u -> u.isActive()) // 只处理活跃用户
.flatMap(u -> Optional.ofNullable(u.getAddress())) // 获取用户的地址
.map(Address::getCity) // 获取城市名
.ifPresent(city -> System.out.println("The user is from " + city)); // 输出城市名
}
在这个例子中,我们首先检查user是否为null,然后检查用户是否活跃,接着获取用户的地址,最后获取城市的名称。如果任何一个步骤的结果是null,整个链式调用就会终止。
合并值
需要合并多个可能为null的值,可以使用Optional的or方法:
public void mergeAddresses(User user) {
String primaryCity = Optional.ofNullable(user.getPrimaryAddress())
.map(Address::getCity)
.orElse("Unknown");
String secondaryCity = Optional.ofNullable(user.getSecondaryAddress())
.map(Address::getCity)
.orElse("Unknown");
String city = Optional.of(primaryCity)
.or(() -> Optional.of(secondaryCity))
.orElse("No City Found");
System.out.println("City: " + city);
}
尝试获取用户的主要地址和次要地址的城市名。如果主要地址的城市名未知,我们就使用次要地址的城市名。如果两者都未知,就使用默认值"No City Found"。
通过使用Optional,我们可以写出更加安全、易于理解和维护的代码。它帮助我们避免了大量的空值检查,减少了代码中的模板模式,并提高了代码的可读性和可维护性。
标签:getName,特性,JDK8,user,null,Optional,public,User From: https://www.cnblogs.com/dragon-925/p/18394572