Optional基础用法

简介

Optional 是 Java 8 引入的一个容器对象,主要用于表示可能存在或不存在的值。它用于避免 null 值带来的空指针异常(NullPointerException),使代码更加清晰和安全。

用法:

1. 创建 Optional 对象

  • 使用 Optional.of():用于创建一个非空的 Optional 对象。
Optional<String> optionalValue = Optional.of("Hello");
  • 使用 Optional.ofNullable():可以创建一个可能为 null 的 Optional 对象。
Optional<String> optionalValue = Optional.ofNullable(null); // 允许为 null
  • 使用 Optional.empty():创建一个为空的 Optional 对象。
Optional<String> emptyOptional = Optional.empty();

2. 检查值的存在性

  • 使用 isPresent():检查 Optional 中是否有值。
if (optionalValue.isPresent()) {
    System.out.println(optionalValue.get());
}
  • 使用 ifPresent():如果值存在,则执行给定的操作。
optionalValue.ifPresent(value -> System.out.println(value));

3. 获取值

  • 使用 get():获取 Optional 中的值,如果值不存在,会抛出 NoSuchElementException。
String value = optionalValue.get();
  • 使用 orElse():如果值存在,返回该值;否则返回指定的默认值。
String value = optionalValue.orElse("Default Value");
  • 使用 orElseGet():如果值不存在,返回由 Supplier 生成的值。
String value = optionalValue.orElseGet(() -> "Generated Value");
  • 使用 orElseThrow():如果值不存在,抛出指定的异常。
String value = optionalValue.orElseThrow(() -> new IllegalArgumentException("Value is absent"));

4. 转换值

  • 使用 map():对 Optional 中的值进行转换,如果值存在,返回转换后的结果
Optional<Integer> lengthOptional = optionalValue.map(String::length);
  • 使用 flatMap():与 map() 类似,但用于返回一个 Optional 的情况,避免嵌套的 Optional。
Optional<Integer> lengthOptional = optionalValue.flatMap(value -> Optional.of(value.length()));

5. 过滤值

  • 使用 filter():根据条件过滤 Optional 中的值,如果条件不满足,则返回一个空的 Optional。
Optional<String> filtered = optionalValue.filter(value -> value.startsWith("H"));

DEMO

public class OptionalExample {
    public static void main(String[] args) {
        Optional<String> optionalValue = Optional.ofNullable("Hello, World!");

        // 检查值是否存在
        optionalValue.ifPresent(System.out::println);

        // 获取值或默认值
        String value = optionalValue.orElse("Default Value");
        System.out.println(value);

        // 使用 map 转换
        Optional<Integer> lengthOptional = optionalValue.map(String::length);
        lengthOptional.ifPresent(length -> System.out.println("Length: " + length));
    }
}

原理

Optional类

执行构造函数Optional(T value) 调用 Object.requireNonNull 如果为空就报 npe 不为空则返回value

empty()

就是返回EMPTY对象 Optional类内部还维护一个value为null的对象

ofNullable

内部 return value == null ? empty() : of (value) 也就是 value不为空时 返回value 为空时返回null对象

orElse

orElse(T other),orElseGet(Supplier<? extends T> other)和orElseThrow(Supplier<? extends X> exceptionSupplier)

三个函都是在构造函数传入的value值为null时,进行调用的

orElse 用来直接赋值
orElseGet 用来调用为空时调用的函数
orElseThrow 为空时抛一个异常出去

map

map(Function<? super T, ? extends U> mapper)和flatMap(Function<? super T, Optional> mapper)

这两个函数做的是转换值的操作。

首先解释一下 Function 它是一个函数接口,它可以用来接受lambda表达式
函数接受一个参数并返回结果,它包含一种方法 apply() => R apply(T t) 其中 R为结果 T是函数参数

  1. isPresent()和ifPresent(Consumer<? super T> consumer)
    Present即判断value值是否为空,而ifPresent就是在value值不为空时,做一些操作。
  2. =>filter 方法接受一个 Predicate 来对 Optional 中包含的值进行过滤,如果包含的值满足条件,那么还是返回这个 Optional;否则返回 Optional.empty。
    eg: Optional user = Optional.ofNullable(user).filter(u->u.getName.length<6)
    如上所示,如果user的name的长度是小于6的,则返回。如果是大于6的,则返回一个EMPTY对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值