Optional

  • Optional本质是一个包装值的盒子,盒子里面有可能有对象,也有可能为空,但是不管哪种情况,这个Option本身是存在的,从而避免了直接操作null对象的风险

  • image

// 1. 创建 Optional 对象
        User realUser = new User("admin", 1);
        User nullUser = null;

        // 包装非 null 值
        Optional<User> optionalWithValue = Optional.of(realUser);
        // 包装可能为 null 的值(最常用)
        Optional<User> optionalWithNull = Optional.ofNullable(nullUser);
        // 空 Optional
        Optional<User> optionalEmpty = Optional.empty();

        // 2. 取值/处理
        // 有值则输出,无值不执行
        optionalWithValue.ifPresent(user -> System.out.println("用户名:" + user.getName())); // 输出:用户名:admin
        optionalWithNull.ifPresent(user -> System.out.println("用户名:" + user.getName())); // 无输出

        // 无值时返回默认值
        User defaultUser = optionalWithNull.orElse(new User("guest", 0));
        System.out.println(defaultUser.getName()); // 输出:guest

        // 无值时生成默认值(懒加载)
        User lazyUser = optionalWithNull.orElseGet(() -> createGuestUser());
        System.out.println(lazyUser.getName()); // 输出:guest_lazy

        // 无值时抛异常
        try {
            optionalWithNull.orElseThrow(() -> new NullPointerException("用户不存在"));
        } catch (NullPointerException e) {
            System.out.println(e.getMessage()); // 输出:用户不存在
        }
  • 链式调用,ofNullable表示可能封装了一个对象也可能为null,map主要是对对象进行转换,先从User中拿到Address不为空的对象,然后再从Address拿到City属性,所以Map方法主要是做转换的,可以穿透层级拿数据,但是Filter方法是根据条件判断是否符合条件,不符合筛除掉
Optional.ofNullable(user)
        .map(User::getAddress)
        .map(Address::getCity)
        .ifPresent(city -> System.out.println(city));
posted @ 2026-01-23 17:11  Huangyien  阅读(2)  评论(0)    收藏  举报