Optional类中的orElse和orElseGet的区别

  1. orElse方法与orElseGet方法对比表

Optional内对象参数效果注释
null对象相同

orElse和orElseGet方法都会返回参数对象

不为null对象相同返回Optional内对象
null有返回值的函数相同orElse和orElseGet方法都会返回参数内函数返回值
不为null有返回值的函数不同返回Optional内对象,但orElseGet不会执行函数内容,orElse会执行函数内容

2. 简单示例(仅针对orElse与orElseGet方法不同的情况,即Optional内对象不为null,且参数为有返回值函数)

 2.1 准备类

public class Staff {
        String name;
        Integer age;
        ... // getter setter
}

2.2 orElse 和 orElseGet的对比

    @Test
    void optionalTest(){

        Staff staff = new Staff("Jerome",12);

        System.out.println("----------------------orElseGet---------------------------");
        staffName = Optional.ofNullable(staff).map(s -> s.getName()).orElseGet(this::getName);
        System.out.println(staffName);

        System.out.println("----------------------orElse---------------------------");
        staffName = Optional.ofNullable(staff).map(s -> s.getName()).orElse( getName());
        System.out.println(staffName);
    }

    private String getName(){
        System.out.println("Get String if null");
        return "Get String";
    }

显示效果

----------------------orElseGet---------------------------
Jerome
----------------------orElse---------------------------
Get String if null
Jerome

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
`orElse()` 和 `orElseGet()` 都是用于处理 `Optional` 对象为空的情况,提供一个备用值作为替代。它们之间的区别在于备用值的生成方式。 `orElse()` 方法在 `Optional` 对象为空时,会直接返回指定的备用值。无论 `Optional` 是否为空,备用值都会被计算。这意味着即使 `Optional` 中已经包含了一个非空的值,备用值也会被计算。 `orElseGet()` 方法在 `Optional` 对象为空时,会调用一个提供者函数来生成备用值。只有当 `Optional` 为空时,提供者函数才会被调用。如果 `Optional` 不为空,提供者函数不会执行。 以下是 `orElse()` 和 `orElseGet()` 方法的示例代码: ```java import java.util.Optional; public class OptionalExample { public static void main(String[] args) { Optional<String> optional1 = Optional.empty(); String value1 = optional1.orElse(getDefaultValue()); System.out.println(value1); // 输出:Default Value Optional<String> optional2 = Optional.of("Hello"); String value2 = optional2.orElse(getDefaultValue()); System.out.println(value2); // 输出:Hello Optional<String> optional3 = Optional.empty(); String value3 = optional3.orElseGet(() -> getDefaultValue()); System.out.println(value3); // 输出:Default Value Optional<String> optional4 = Optional.of("Hello"); String value4 = optional4.orElseGet(() -> getDefaultValue()); System.out.println(value4); // 输出:Hello } public static String getDefaultValue() { System.out.println("Generating default value..."); return "Default Value"; } } ``` 在上述代码中,我们创建了两个 `Optional` 对象 `optional1` 和 `optional2`,分别为空和包含字符串 "Hello"。然后,我们使用 `orElse()` 和 `orElseGet()` 方法获取备用值。 对于 `optional1`,`orElse()` 和 `orElseGet()` 都会返回备用值 "Default Value",因为 `optional1` 为空。对于 `optional2`,`orElse()` 方法不会调用提供者函数,而直接返回 `optional2` 中的值 "Hello"。而 `orElseGet()` 方法也不会调用提供者函数,因为 `optional2` 不为空。 输出: ``` Generating default value... Default Value Hello Generating default value... Default Value Hello ``` 从输出结果可以看出,`orElse()` 方法和 `orElseGet()` 方法都可以用来获取备用值,但是在备用值的生成方式上略有不同。如果备用值的计算代价较高,或者备用值是根据需要动态生成的,建议使用 `orElseGet()` 方法以避免不必要的计算。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值