1、一般方法判断null值
最直接的方法,使用if
语句检查变量是否为null
。
if(country != null && country.getCity() != null && country.getCity().getSchool() != null && country.getCity().getSchool().getStudent() != null .....) { isValid = true; }
2、通过Optional判断null值
Optional
类是Java 8引入的,用于表示可能为null
的值。
if (Optional.ofNullable(country) .map(Country::getCity) .map(City::getSchool) .map(School::getStudent) .isPresent()) { isValid = true; }
或
boolean isValid = Optional.ofNullable(country) .map(Country::getCity) .map(City::getSchool) .map(School::getStudent) .isPresent();
或
boolean isValid = Optional.ofNullable(country) .map(country -> country.getCity()) //Or use method reference Country::getCity .map(city -> city.getSchool()) .map(school -> school.getStudent()) .map(student -> true) .orElse(false);
3、使用Supplier<Object> var-args参数判断null值
Java 8 引入了 Supplier<T>
接口,它代表了一个可以提供泛型类型 T 值的函数。我们可以利用 Supplier
接口来创建可变参数(var-args)的方法,用于判断多个对象是否为null。
boolean isValid = isValid(() -> address, // first level () -> address.getCity(), // second level () -> address.getCountry(),// second level () -> address.getStreet(), // second level () -> address.getZip(), // second level () -> address.getCountry() // third level .getISO() @SafeVarargs public static boolean isValid(Supplier<Object>... suppliers) { for (Supplier<Object> supplier : suppliers) { if (Objects.isNull(supplier.get())) { // log, handle specific thing if required return false; } } return true; }
或
boolean isValid = isValid( Arrays.asList("address", "city", "country", "street", "zip", "Country ISO"), () -> address, // first level () -> address.getCity(), // second level () -> address.getCountry(),// second level () -> address.getStreet(), // second level () -> address.getZip(), // second level () -> address.getCountry() // third level .getISO() ); @SafeVarargs public static boolean isValid(List<String> fieldNames, Supplier<Object>... suppliers) { if (fieldNames.size() != suppliers.length){ throw new IllegalArgumentException("..."); } for (int i = 0; i < suppliers.length; i++) { if (Objects.isNull(suppliers.get(i).get())) { LOGGER.info( fieldNames.get(i) + " is null"); return false; } } return true; }