前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于Optional的一些常用API

关于Optional的一些常用API

作者头像
关忆北.
发布2021-12-07 16:44:09
3140
发布2021-12-07 16:44:09
举报
文章被收录于专栏:关忆北.关忆北.关忆北.

Optional

Optional.of

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

image-20210625142108159
image-20210625142108159
Optional.ofNullable

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

image-20210625142905857
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-20210624110442453
image-20210624110213670
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-20210624141931259
image-20210624141906195
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女朋友没名字!"));
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-06-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Optional
    • Optional.of
      • Optional.ofNullable
        • Optional.empty()
          • Optional.ifPresent
            • orElse
              • orElseGet
                • orElseThrow
                  • map
                    • filter
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档