java8的函数式编程中中提供了Optional 类型, 旨在帮助用户规避NEP, 如果stram中的值都为0,
Optional提供了很多方法让用户自己觉得要怎么办?
看下这段代码
调用isPresent返回值决定输出
public final static Function <List< File CheckOut>, Double> getAverageDefectCntFunction =
(ruleResults) ->
{
if (ruleResults.isEmpty()) {
return 0.0000;
}
OptionalDouble a = ruleResults.stream().parallel()
.mapToDouble(p -> p.getDefectCnt()).average();
logger.info("[getAsDouble---->]" + a.toString());
if (a.isPresent()){
return a.getAsDouble();
}else {
return 0.0000;
}
};
防止NPE的功能
如果要用optional来避免NPE,则需要改造getter方法
public class User {
private Address address;
public Optional<Address> getAddress() {
return Optional.ofNullable(address);
}
// ..
}
public class Address {
private Country country;
public Optional<Country> getCountry() {
return Optional.ofNullable(country);
}
//..
}
之前的代码
if (user != null) {
Address address = user.getAddress();
if (address != null) {
Country country = address.getCountry();
if (country != null) {
String isocode = country.getIsocode();
if (isocode != null) {
isocode = isocode.toUpperCase();
}
}
}
}
一大堆判空处理,使用option之后是这样的
@Test
public void whenChaining_thenOk() {
User user = new User("anna@gmail.com", "1234");
String result = Optional.ofNullable(user)
.flatMap(u -> u.getAddress())
.flatMap(a -> a.getCountry())
.map(c -> c.getIsocode())
.orElse("default");
assertEquals(result, "default");
}
optiondouble的实现方法