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 "动态生成的默认值";
    }
}

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

相关推荐
阿维的博客日记2 分钟前
spring里面的@RequestParam什么意思
java·后端·spring
laowangpython3 分钟前
昆仑通态 Mcgs Pro软件安装步骤(附安装包)Mcgs Pro 3.3.6 下载安装教程(保姆级)
java·服务器·数据库·其他
罗超驿32 分钟前
6.Java LinkedList深度解析:从链表原理到源码实践
java·开发语言·链表
2501_9481069135 分钟前
计算机毕业设计之jsp物业管理系统
java·大数据·开发语言·汽车·课程设计
黑taoA42 分钟前
深度解析:Maven核心命令(clean、compile、package、install)与IDEA多模块项目避坑指南
java·maven·intellij-idea
TDengine (老段)44 分钟前
TDengine 索引使用指南 — 何时建、怎么建、怎么用
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
xlxxy_1 小时前
sap获取批次特性报表
java·linux·开发语言·前端·数据库·abap·mm
栋***t1 小时前
从“工具”到“基建”,麦塔在线考试系统经历的时代变局与定位逻辑
java·大数据·数据库·开源软件·无纸化
欢喜躲在眉梢里1 小时前
用飞算Java做了一套新能源充电运营管理系统:把站点、设备、订单拆成可运营的微服务
java·开发语言·微服务·ai编程·技术分享·java开发·飞算javaai炫技赛
薛定猫AI1 小时前
【技术干货】大模型文档结构化提取实战:Python解析PDF发票并批量生成CSV
java·python·pdf