Optional和ifPresent进⾏判空处理
Optional和ifPresent进⾏判空处理
JDK 1.8加⼊了 Optional 类。⽤于避免⽤if判空时出现空指针异常,它就是⼀个包裹着对象的容器。如果值存在则 isPresent()⽅法会返回true,调⽤ get() ⽅法会返回该对象。
JDK 提供三个静态⽅法来构造⼀个 Optional:
Optional.of(T value) 该⽅法通过⼀个⾮ null 的 value 来构造⼀个 Optional,返回的 Optional 包含了 value 这个值。对于该⽅法,传⼊的参数⼀定不能为 null,否则便会抛出 NullPointerException。
Optional.ofNullable(T value) 该⽅法和 of ⽅法的区别在于,传⼊的参数可以为 null,进⾏三⽬运算,判断传⼊的参数是否为 null,如果为null 的话,返回的就是 pty()。
Optional 提供的⽅法
1.ifPresent
@Component
@Slf4j
public class KafkaConsumer {
@KafkaListener(topics = {"luobo"})
public void listen(ConsumerRecord<?,?> record){
Optional.ofNullable(record.value())
.ifPresent(message -> {
log.info("------------------record = {}",record);
log.info("--------------message= {}",message);
});
}
}
如果 Optional 中有值,则对该值调⽤ consumer.accept,否则什么也不做。所以对于上⾯的例⼦,我们可以修改为:
Optional<User> user = Optional.ofNullable(getUserById(id));
user.ifPresent(u -> System.out.println("Username is: " + u.getUsername()));
public T orElse(T other) {
return value != null ? value : other;
}
如果 Optional 中有值则将其返回,否则返回 orElse ⽅法传⼊的参数。
User user = Optional
.ofNullable(getUserById(id))
.orElse(new User(0, "Unknown"));
System.out.println("Username is: " + Username());
public T orElseGet(Supplier<? extends T> ither) {
return value != null ? value : ();
}
orElseGet 与 orElse ⽅法的区别在于,orElseGet ⽅法传⼊的参数为⼀个 Supplier 接⼝的实现 —— 当 Optional 中有值的时候,返回值;当Optional 中没有值的时候,返回从该 Supplier 获得的值。
User user = Optional
.ofNullable(getUserById(id))
.orElseGet(() -> new User(0, "Unknown"));
System.out.println("Username is: " + Username());
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
if (value != null) {
return value;
} else {
();
}
}
orElseThrow 与 orElse ⽅法的区别在于,orElseThrow ⽅法当 Optional 中有值的时候,返回值;没有值的时候会抛出异常,抛出的异常由传⼊的 exceptionSupplier 提供。
User user = Optional
.ofNullable(getUserById(id))
.orElseThrow(() -> new EntityNotFoundException("id 为 " + id + " 的⽤户没有到"));
举⼀个 orElseThrow 的⽤途:在 SpringMVC 的控制器中,我们可以配置统⼀处理各种异常。查询某个实体时,如果数据库中有对应的记录便返回该记录,否则就可以抛出 EntityNotFoundException ,处理 EntityNotFoundException 的⽅法中我们就给客户端返回Http 状态码404 和异常对应的信息 —— orElseThrow 完美的适⽤于这种场景。
@RequestMapping("/{id}")
public SysUser getSysUser(@PathVariable Integer id) {
Optional<SysUser> user = SysUserById(id);
ElseThrow(() -> new EntityNotFoundException("id 为 " + id + " 的⽤户不存在"));
}
@ExceptionHandler(EntityNotFoundException.class)
public ResponseEntity<String> handleException(EntityNotFoundException ex) {
return new ResponseEntity<>(ex.getMessage(), HttpStatus.NOT_FOUND);
unknown怎么处理}
5.map
public <U> Optional<U> map(Function<? super T, ? extends U> mapper) {
if (!isPresent()){
return empty();
} else {
return Optional.ofNullable(mapper.apply(value));
}
}
如果当前 Optional 为 pty,则依旧返回 pty;否则返回⼀个新的 Optional,该 Optional 包含的是:函数 mapper 在以 value 作为输⼊时的输出值。
Optional<String> username = Optional
.ofNullable(getUserById(id))
.map(user -> Username());
System.out.println("Username is: " + Else("Unknown"));
⽽且我们可以多次使⽤ map 操作:
Optional<String> username = Optional
.ofNullable(getUserById(id))
.map(user -> Username())
.map(name -> LowerCase())
.map(name -> place('_', ' '));
System.out.println("Username is: " + Else("Unknown"));
6.flatMap
public <U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) {
if (!isPresent()){
return empty();
} else {
quireNonNull(mapper.apply(value));
}
}
flatMap ⽅法与 map ⽅法的区别在于,map ⽅法参数中的函数 mapper 输出的是值,然后 map ⽅法会使⽤ Optional.ofNullable 将其包装为Optional;⽽ flatMap 要求参数中的函数 mapper 输出的就是 Optional。
Optional<String> username = Optional
Optional;⽽ flatMap 要求参数中的函数 mapper 输出的就是 Optional。
Optional<String> username = Optional
.ofNullable(getUserById(id))
.flatMap(user -> Optional.Username()))
.flatMap(name -> Optional.LowerCase()));
System.out.println("Username is: " + Else("Unknown"));
7.filter
public Optional<T> filter(Predicate<? super T> predicate) {
if(!isPresent()) {
return this;
} else {
st(value) ? this : empty();
}
}
filter ⽅法接受⼀个 Predicate 来对 Optional 中包含的值进⾏过滤,如果包含的值满⾜条件,那么还是返回这个 Optional;否则返回pty。
Optional<String> username = Optional
.ofNullable(getUserById(id))
.filter(user -> Id() < 10)
.map(user -> Username());
System.out.println("Username is: " + Else("Unknown"));

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。