关于Optional的一些常用API

·  阅读 123
关于Optional的一些常用API

Optional

Optional.of

该方法的入参是一个非null值,如果该值为null,则抛出NullPointerException,不为Null则返回该值。

image-20210625142108159

Optional.ofNullable

非Null时返回该值,为null时返回一个Optional.empty()

image-20210625142905857

Optional.empty()

通过构造方法返回一个空的Optional实例。

Optional<User> user = Optional.ofNullable(getUserById(id));
if (user.isPresent()) {
    String username = user.get().getUsername();
    System.out.println("Username is: " + username); // 使用 username
}
复制代码

代码是优美了点 —— 但是事实上这与之前判断 null 值的代码没有本质的区别,反而用 Optional 去封装 value,增加了代码量。

Optional.ifPresent

更好的使用Optional:

User user = userService.getUser(userId);
Optional<User> optionalUser = Optional.ofNullable(user);
//存在值时调用ifPresent中的内容
optionalUser.ifPresent(value -> log.debug(value.getUsername()));
复制代码

Consumer,适用于JDK8的函数式接口,作为lambda表达式的入参,将参数包装消费

image-20210624110442453

image-20210624110213670

结合Optional的源码来看,Optional中如果有值则会调用Consumer.accept(value);

orElse

User unknown = Optional.ofNullable(user).orElse(new User(0, "Unknown"));
复制代码

orElseGet

User unknownGet = Optional.ofNullable(userService.getUser(userId)).orElseGet(() -> new User(0, "UnknownGet"));
复制代码

两者的作用是当入参是null时,匹配自定义默认值

public static void main(String[] args) {
    String name = Optional.of("baeldung").orElse(getRandomName());
    log.info(name);
}

private static String getRandomName() {
    List<String> names = new ArrayList<>();
    names.add("zhangsan");
    names.add("李四");
    names.add("wangwu");

    log.info("getRandomName() method - start");

    Random random = new Random();
    int index = random.nextInt(3);
    log.debug("getRandomName() method - end");
    return names.get(index);
}
复制代码

Remember (from the Javadoc) that the Supplier method passed as an argument is only executed when *an Optional* value is not present.

image-20210624141931259

image-20210624141906195

区别:
  1. orElse与orElseGet的区别是前者的入参是一个泛型T,后者是一个函数式方法的结果。
  2. 即使ofNullable中的值是null,orElse中的代码也会执行

orElseThrow

当Optional中为空值时抛出异常

User user = Optional
        .ofNullable(getUserById(id))
        .orElseThrow(() -> new EntityNotFoundException("id 为 " + id + " 的用户没有找到"));
复制代码

map

String password = " password ";
Optional<String> passOpt = Optional.of(password);
boolean correctPassword = passOpt.filter(pass -> pass.equals("password")).isPresent();//false
boolean password1 = passOpt.map(String::trim).filter(pass -> pass.equals("password")).isPresent();//true
复制代码

filter

Person person = new Person("NICK",22);
Optional<Person> personOptional = Optional.ofNullable(person);
Optional<String> optionalName = personOptional
        .map(Person::getName)
        .orElseThrow(() -> new RuntimeException("你nameOptionalWrapper女朋友没名字!"));
复制代码
分类:
后端
标签: