主页 > 游戏开发  > 

Java高频面试之SE-22

Java高频面试之SE-22

hello啊,各位观众姥爷们!!!本baby今天又来了!哈哈哈哈哈嗝🐶

Java中的Optional了解多少?

在 Java 中,Optional 是 Java 8 引入的一个容器类,用于显式处理可能为 null 的值,避免 NullPointerException(空指针异常)。它的核心思想是将“空值”包装成一个对象,通过链式调用强制本baby显式处理空值场景,提升代码的可读性和健壮性。


1. Optional 的核心设计 不可变容器:Optional 对象一旦创建,其内部的值不可修改。明确语义:通过方法名(如 isPresent()、orElse())明确表达值的“存在性”和“默认值”逻辑。链式调用:支持函数式风格的链式操作(如 map()、filter())。
2. 创建 Optional 方法描述Optional.empty()创建一个空的 Optional 对象(值为 null)。Optional.of(T)创建非空 Optional,若值为 null 会抛出 NullPointerException。Optional.ofNullable(T)创建 Optional,若值为 null,返回 Optional.empty()。

示例:

Optional<String> emptyOpt = Optional.empty(); Optional<String> nameOpt = Optional.of("叶文洁"); Optional<String> nullableOpt = Optional.ofNullable(getName()); // getName() 可能返回 null
3. 常用操作方法 (1) 检查值是否存在 方法描述isPresent()判断值是否存在(非 null)。isEmpty()判断值是否为空(Java 11+)。

示例:

if (nameOpt.isPresent()) { System.out.println("Name: " + nameOpt.get()); } (2) 获取值 方法描述get()直接获取值,若值为 null 抛出 NoSuchElementException。不推荐直接使用。orElse(T)值存在时返回值,否则返回默认值。orElseGet(Supplier)值存在时返回值,否则通过 Supplier 生成默认值(延迟计算)。orElseThrow()值存在时返回值,否则抛出指定异常(Java 10+)。

示例:

String name1 = nameOpt.orElse("Unknown"); // 默认值 String name2 = nameOpt.orElseGet(() -> fetchDefaultName()); // 延迟计算 String name3 = nameOpt.orElseThrow(() -> new IllegalStateException("Name not found")); (3) 链式操作 方法描述map(Function)对值进行转换,若值为空,返回 Optional.empty()。flatMap(Function)类似 map,但 Function 需返回 Optional,避免嵌套 Optional。filter(Predicate)过滤值,若条件不满足,返回 Optional.empty()。

示例:

Optional<User> userOpt = Optional.ofNullable(user); String email = userOpt .map(User::getAddress) .map(Address::getEmail) .orElse("no-email@luoji ");
4. 使用场景与最佳实践 (1) 适用场景 返回值可能为 null 的方法:public Optional<User> findUserById(int id) { // 如果找不到,返回 Optional.empty() } 链式处理嵌套对象:避免深层 if (obj != null) 检查。显式表达“空值”语义:强制调用方处理可能的空值。 (2) 避免的陷阱

不要滥用 Optional:

不要用 Optional 作为方法参数或类的字段(违反设计初衷)。不要用 Optional 代替集合(如 Optional<List> 应直接用空集合 Collections.emptyList())。

避免 isPresent() + get() 组合:

// 不推荐: if (opt.isPresent()) { String value = opt.get(); } // 推荐: opt.ifPresent(value -> {...});
5. Java 9+ 的增强

Java 9 对 Optional 进行了扩展,新增方法:

方法描述ifPresentOrElse()值存在时执行一个操作,否则执行另一个操作。or()值存在时返回当前 Optional,否则返回另一个 Optional。stream()将 Optional 转换为 Stream。

示例:

nameOpt.ifPresentOrElse( name -> System.out.println("Name: " + name), () -> System.out.println("Name not found") );
🐮🐎 Optional 的核心价值是强制开发者显式处理空值,减少 NullPointerException。推荐链式操作(如 map()、flatMap())代替直接检查 isPresent()。避免滥用,仅用于方法返回值,而非参数或字段。Java 9+ 提供更丰富的链式操作(如 ifPresentOrElse())。

正确使用 Optional 可以让代码更简洁、安全,但需结合场景合理选择其与传统的 null 检查。

标签:

Java高频面试之SE-22由讯客互联游戏开发栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“Java高频面试之SE-22