Java Optional orElse orElseGet orElseThrow()

在 Java 中,Optional orElse类型 包含 .orElse() .orElseThrow()

orElseThrow() 用法:

无参版本:当 Optional 为空时,抛出 NoSuchElementException;

java 复制代码
Optional<String> optionalValue = Optional.empty();
String value = optionalValue.orElseThrow(); // 当为空时抛出 NoSuchElementException

带参版本:可以自定义抛出的异常类型

java 复制代码
Optional<String> optionalValue = Optional.empty();
String value = optionalValue.orElseThrow(() -> new IllegalArgumentException("值不存在"));

用法示例:

java 复制代码
import java.util.Optional;
import java.util.function.Supplier;

public class OrElseGetExample {
    public static void main(String[] args) {
        // 1. Optional 有值的情况
        Optional<String> presentOpt = Optional.of("存在的值");
        String result1 = presentOpt.orElseGet(() -> {
            System.out.println("执行了默认值逻辑(本不该执行)"); // 不会执行
            return "默认值";
        });
        System.out.println(result1); // 输出:存在的值


        // 2. Optional 为空的情况
        Optional<String> emptyOpt = Optional.empty();
        String result2 = emptyOpt.orElseGet(() -> {
            System.out.println("执行了默认值逻辑"); // 会执行
            return "通过Supplier生成的默认值";
        });
        System.out.println(result2); // 输出:通过Supplier生成的默认值


        // 3. 实际场景:复杂默认值的创建(如数据库查询)
        Optional<User> userOpt = Optional.empty(); // 假设从数据库查询结果为空
        User defaultUser = userOpt.orElseGet(() -> fetchDefaultUserFromDB());
        System.out.println("使用的用户:" + defaultUser.getName()); // 输出:默认用户
    }

    // 模拟从数据库获取默认用户(成本较高的操作)
    private static User fetchDefaultUserFromDB() {
        System.out.println("执行数据库查询获取默认用户...");
        return new User("默认用户");
    }

    static class User {
        private String name;
        public User(String name) { this.name = name; }
        public String getName() { return name; }
    }
}

使用时要注意,如果 Optional 为空,这个方法会立即抛出异常,而不是返回默认值,这是它与 orElse()orElseGet() 的主要区别。

orElseGet() 用法:

java 复制代码
import java.util.Optional;
import java.util.function.Supplier;

public class OrElseGetExample {
    public static void main(String[] args) {
        // 1. Optional 有值的情况
        Optional<String> presentOpt = Optional.of("存在的值");
        String result1 = presentOpt.orElseGet(() -> {
            System.out.println("执行了默认值逻辑(本不该执行)"); // 不会执行
            return "默认值";
        });
        System.out.println(result1); // 输出:存在的值


        // 2. Optional 为空的情况
        Optional<String> emptyOpt = Optional.empty();
        String result2 = emptyOpt.orElseGet(() -> {
            System.out.println("执行了默认值逻辑"); // 会执行
            return "通过Supplier生成的默认值";
        });
        System.out.println(result2); // 输出:通过Supplier生成的默认值


        // 3. 实际场景:复杂默认值的创建(如数据库查询)
        Optional<User> userOpt = Optional.empty(); // 假设从数据库查询结果为空
        User defaultUser = userOpt.orElseGet(() -> fetchDefaultUserFromDB());
        System.out.println("使用的用户:" + defaultUser.getName()); // 输出:默认用户
    }

    // 模拟从数据库获取默认用户(成本较高的操作)
    private static User fetchDefaultUserFromDB() {
        System.out.println("执行数据库查询获取默认用户...");
        return new User("默认用户");
    }

    static class User {
        private String name;
        public User(String name) { this.name = name; }
        public String getName() { return name; }
    }
}

orElse() 用法:

java 复制代码
import java.util.Optional;

public class OrElseExample {
    public static void main(String[] args) {
        // 1. Optional 有值的情况
        Optional<String> presentOpt = Optional.of("存在的值");
        String result1 = presentOpt.orElse("默认值");
        System.out.println(result1); // 输出:存在的值


        // 2. Optional 为空的情况
        Optional<String> emptyOpt = Optional.empty();
        String result2 = emptyOpt.orElse("默认值");
        System.out.println(result2); // 输出:默认值


        // 3. 注意:默认值的逻辑总会执行(即使 Optional 有值)
        Optional<String> opt = Optional.of("有值");
        String result3 = opt.orElse(generateDefaultValue()); 
        // 这里会先执行 generateDefaultValue(),再返回 "有值"
    }

    // 生成默认值的方法
    private static String generateDefaultValue() {
        System.out.println("执行了生成默认值的逻辑");
        return "动态生成的默认值";
    }
}

实际开发中需要按具体需求去使用它们

相关推荐
czhc11400756633 小时前
JAVA1026 方法;类:抽象类、抽象类继承;接口、接口继承 Linux:Mysql
java·linux·mysql
一 乐3 小时前
宠物管理|宠物店管理|基于SSM+vue的宠物店管理系统(源码+数据库+文档)
java·前端·数据库·vue.js·论文·毕设·宠物
gAlAxy...4 小时前
面试JAVASE基础(五)——Java 集合体系
java·python·面试·1024程序员节
ceclar1234 小时前
C++容器list
java·c++·list
张较瘦_4 小时前
[论文阅读] 从 5MB 到 1.6GB 数据:Java/Scala/Python 在 Spark 中的性能表现全解析
java·python·scala
Han.miracle4 小时前
数据库圣经-----最终章JDBC
java·数据库·学习·maven·database
艾菜籽5 小时前
MyBatis操作数据库入门
java·数据库·mybatis
zfoo-framework5 小时前
使用VisualVM进行java性能瓶颈定位 1.无需像JProfiler那样必须加启动参数???
java
bug攻城狮5 小时前
Spring Boot 2.6+ 整合 PageHelper 启动报错:循环依赖解决方案全解析
java·spring boot·后端