java8的函数式编程中中提供了Optional 类型, 旨在帮助用户规避NEP, 如果stram中的值都为0,

Optional提供了很多方法让用户自己觉得要怎么办?

看下这段代码

调用isPresent返回值决定输出

  public final static Function<List<FileCheckOut>, 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的实现方法 

 

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐