Optional 详细总结

        Optional 之所以可以解决 NPE(空指针异常) 的问题,是因为它明确的告诉我们,不需要对它进行判空。

创建 Optional 对象

1、可以使用静态方法 empty() 创建一个空的 Optional 对象

Optional<String> empty = Optional.empty();
System.out.println(empty); // 输出:Optional.empty

2、可以使用静态方法 of() 创建一个非空的 Optional 对象

Optional<String> opt = Optional.of("沉默王二");
System.out.println(opt); // 输出:Optional[沉默王二]

        传递给 of() 方法的参数必须是非空的,也就是说不能为 null,否则仍然会抛出 NullPointerException。

3、可以使用静态方法 ofNullable() 创建一个即可空又可非空的 Optional 对象

String name = null;
Optional<String> optOrNull = Optional.ofNullable(name);
System.out.println(optOrNull); // 输出:Optional.empty

ofNullable() 方法内部有一个三元表达式,如果为参数为 null,则返回私有常量 EMPTY;否则使用 new 关键字创建了一个新的 Optional 对象——不会再抛出 NPE 异常了。

判断值是否存在

        可以通过方法 isPresent() 判断一个 Optional 对象是否存在,如果存在,该方法返回 true,否则返回 false

Optional<String> opt = Optional.of("沉默王二");
System.out.println(opt.isPresent()); // 输出:true

Optional<String> optOrNull = Optional.ofNullable(null);
System.out.println(optOrNull.isPresent()); // 输出:false

非空表达式

        Optional 类有一个非常现代化的方法——ifPresent(),允许我们使用函数式编程的方式执行一些代码,因此,我把它称为非空表达式。

Optional<String> opt = Optional.of("沉默王二");
opt.ifPresent(str -> System.out.println(str.length()));

        Java 9 后还可以通过方法 ifPresentOrElse(action, emptyAction) 执行两种结果,非空时执行 action,空时执行 emptyAction。

Optional<String> opt = Optional.of("沉默王二");
opt.ifPresentOrElse(str -> System.out.println(str.length()), () -> System.out.println("为空"));

设置(获取)默认值

orElse() 方法用于返回包裹在 Optional 对象中的值,如果该值不为 null,则返回;否则返回默认值。该方法的参数类型和值的类型一致

String nullName = null;
String name = Optional.ofNullable(nullName).orElse("沉默王二");
System.out.println(name); // 输出:沉默王二

过滤值

public class FilterOptionalDemo {
    public static void main(String[] args) {
        String password = "12345";
        Optional<String> opt = Optional.ofNullable(password);
        System.out.println(opt.filter(pwd -> pwd.length() > 6).isPresent());
    }
}

  filter() 方法的参数类型为 Predicate(Java 8 新增的一个函数式接口),也就是说可以将一个 Lambda 表达式传递给该方法作为条件,如果表达式的结果为 false,则返回一个 EMPTY 的 Optional 对象,否则返回过滤后的 Optional 对象。

还可以再追加一个条件:

Predicate<String> len6 = pwd -> pwd.length() > 6;
Predicate<String> len10 = pwd -> pwd.length() < 10;

password = "1234567";
opt = Optional.ofNullable(password);
boolean result = opt.filter(len6.and(len10)).isPresent();
System.out.println(result);

        这次程序输出的结果为 true,因为密码变成了 7 位,在 6 到 10 位之间。想象一下,假如小王使用 if-else 来完成这个任务,代码该有多冗长。

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的Optional是一个容器类,用于表示一个值可能存在或不存在的情况。它可以用来解决空指针异常的问题,并提供了一些便捷的方法来处理值的存在与否。 使用Optional的主要步骤是: 1. 创建Optional对象:可以使用of()、ofNullable()或empty()方法来创建Optional对象。 - of()方法用于创建一个非空的Optional对象,如果传入的值为null,则会抛出NullPointerException。 - ofNullable()方法用于创建一个Optional对象,传入的值可以是null。 - empty()方法用于创建一个空的Optional对象。 下面是使用示例: ```java Optional<String> optional1 = Optional.of("Hello"); Optional<String> optional2 = Optional.ofNullable(null); Optional<String> optional3 = Optional.empty(); ``` 2. 判断值的存在与否:可以使用isPresent()方法来判断Optional对象中是否存在值。 ```java if (optional1.isPresent()) { System.out.println(optional1.get()); // 输出:Hello } ``` 3. 获取值:可以使用get()方法来获取Optional对象中的值,前提是该值存在,否则会抛出NoSuchElementException异常。为了避免异常,也可以使用orElse()或orElseGet()方法提供默认值。 - orElse()方法在Optional对象中存在值时返回该值,否则返回传入的默认值。 - orElseGet()方法在Optional对象中存在值时返回该值,否则通过传入的Supplier函数生成默认值。 ```java String value1 = optional1.orElse("Default Value"); // 返回Hello String value2 = optional2.orElseGet(() -> "Default Value"); // 返回Default Value ``` 4. 执行操作:可以使用ifPresent()方法来在Optional对象中存在值时执行特定的操作。 ```java optional1.ifPresent(val -> System.out.println("Value: " + val)); // 输出:Value: Hello ``` 除了上述方法,Optional还提供了一系列用于转换、过滤和映射值的方法,如map()、flatMap()、filter()等,可以根据具体的需求使用。 总结Optional类提供了一种优雅的方式来处理可能为空的值,避免了空指针异常,并提供了一些便捷的方法来处理和操作值的存在与否。 希望这个说明和示例能帮助到你。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值