Optional类中,orElse和orElseGet方法的区别

两者之间的区别细微, 但是却在某些场景下显的很重要.
首先, 这是两个在java.util.Optional类中的方法:源码非常简单,

package java.util;
public final class Optional<T> {
    ...
	public T orElse(T other) { 
    	return this.value != null ? this.value : other;
	}
    public T orElseGet(Supplier<? extends T> supplier) {
        return this.value != null ? this.value : supplier.get();
	}
} 
  • Optional相当于一个容器,可以一个接收的对象value,用泛型指定类型,并且该对象有可能为空.
  • Supplier是一个函数式接口,只定义了一个返回值为T类型的get()方法,用于产生(提供)对象,可以使用lambda表达式定义实现
  • orElse(T other) 不论容器是否为空,只要调用该方法, 则对象other一定存在
  • orElseGet(Supplier<? extends T> supplier) 只有当容器为空时,才调用supplier.get()方法产生对象

请想象以下场景:

在分布式开发中,有一个方法需要接收前台数据,但该数据可能为空,
当该数据为空时,需要远程调用一个方法为其设置默认值

	public String getDefaultValue(){  //远程方法调用
        System.out.println("我被调用了!");
        return "我是默认值";
    }
    @Test
    public void testSupplier(){
        Optional<String> opt = Optional.of("前端数据");
        String x = opt.orElse( getDefaultValue() );  
        System.out.println("---以上为orElse调用,以下为orElseGet调用---");
        String y = opt.orElseGet( ()->getDefaultValue() );
    }

运行结果

我被调用了!
---以上为orElse调用,以下为orElseGet调用---

结果为orElse调用方法,orElseGet没有调用方法

  • 可以看到,虽然opt不为空,但是orElse()依然调用了远程方法,并产生了一个String对象
  • orElseGet并没有调用方法,也没有产生任何对象

所以可见orElseGet()更优, 但代价就是需要传入一个Supplier<T>类型的参数,相对会麻烦一些.

如有错误疏漏之处,还请指正,感谢。

  • 15
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
`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()` 方法以避免不必要的计算。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值