如何用Java 8 Optional检查Customer对象所有属性非空?有无更简洁方案?
嘿,这个问题我碰到过好多次了,给你分享几种实用的方案,从用Optional的写法到更简洁的实现都有:
先明确前提
首先得说,你的Customer类里属性是private的,所以得先给email和name加上对应的getter方法(getEmail()、getName()),不然没法访问这些属性哦。
方案1:用Java 8 Optional链式检查
如果想用上Optional,最直观的是把Customer实例包装成Optional,然后用filter来判断两个属性都不为null,最后看Optional是否存在:
public boolean isCustomerValid(Customer customer) { return Optional.ofNullable(customer) .filter(c -> c.getEmail() != null && c.getName() != null) .isPresent(); }
这个写法的好处是可以同时处理customer本身为null的情况——如果传进来的customer是null,直接返回false,不用单独写if判断。
方案2:更简洁的原生写法(推荐简单场景用)
其实对于这种简单的null检查,用Java自带的Objects.nonNull()会更直接,代码也更简洁,可读性拉满:
import java.util.Objects; public boolean isCustomerValid(Customer customer) { if (customer == null) return false; return Objects.nonNull(customer.getEmail()) && Objects.nonNull(customer.getName()); }
这种写法没有多余的封装,性能也更好,适合属性数量不多的场景。
方案3:扩展性更好的Stream写法
如果以后Customer要加更多属性(比如phone、address),用Stream来批量检查会更方便,不用每次加属性都改&&的判断:
import java.util.Objects; import java.util.Optional; import java.util.stream.Stream; public boolean isCustomerValid(Customer customer) { return Optional.ofNullable(customer) .map(c -> Stream.of(c.getEmail(), c.getName())) .map(stream -> stream.allMatch(Objects::nonNull)) .orElse(false); }
以后加属性,只需要在Stream.of()里加对应的getter调用就行,扩展性很强。
额外补充:如果要检查非空字符串
如果你说的“不为空”还包括不能是空字符串/空白字符串,那可以再扩展判断。比如用Java 11+的String.isBlank():
public boolean isCustomerValid(Customer customer) { if (customer == null) return false; return Objects.nonNull(customer.getEmail()) && !customer.getEmail().isBlank() && Objects.nonNull(customer.getName()) && !customer.getName().isBlank(); }
内容的提问来源于stack exchange,提问作者Rogerio Camorim
相关产品推荐
相关产品推荐

