当前位置:网站首页>Optional中orElse和orElseGet的区别
Optional中orElse和orElseGet的区别
2022-08-08 02:51:00 【swadian2008】
很多关于Optional的文章都会提到orElse和orElseGet的区别,大概就像下面例子中的情况:
public static void main(String[] args) {
Optional<String> opt = Optional.ofNullable(null)/*Optional.of("非空数据")*/;
System.out.println(opt.orElse(getDefaultValue())); // 不论opt是否为空,都会立刻调用方法
System.out.println("---以上为orElse调用,以下为orElseGet调用---");
System.out.println(opt.orElseGet(() -> getDefaultValue()));// opt不为空,不调用方法, opt为空,则调用方法
}
public static String getDefaultValue() { //远程方法调用
System.out.println("DefaultValue() 方法被调用了!");
return "返回默认值";
}
- 当
Optonal为空时,无论orElse还是orElseGet都会执行; - 当
Optional有值时,orElse会执行,而orElseGet不会执行。
乍一看确实有点懵,明明有值,为什么还执行,怎么都觉得跟orElse的语义违背
怀着好奇心,我看了下orElse的源码:
public T orElse(T other) {
return value != null ? value : other;
}一开始有点没明白,我传的是一个类调用,这里接收的是一个对象,然后突然就想明白了...
其实不管是orElse还是orElseGet都会进到对应的方法里面的,所以在要执行orElse之前,那参数的值我总要知道吧,所以肯定先要执行传入的方法才行。// 同意该观点
实际跟踪代码也会发现,进到orElse之前,getDefaultValue() 方法就已经执行了。
对比看下orElseGet的源码就更清楚为啥它就不会执行:// 关键在get()
public T orElseGet(Supplier<? extends T> other) {
return value != null ? value : other.get();
}总结
orElse()立即计算,orElseGet()延迟计算。所以如果备选值是无需计算的,现在已有的,那就用orElse。如果值还没得到,那最好用orElseGet延迟执行。
边栏推荐
- 在R中使用Matlab函数
- QML ListView详解
- KDD'22 | CausalMTA: 基于因果推断的无偏广告多触点归因技术
- The ORACLE database connection exception after restart
- 【程序员的七夕浪漫时刻】
- 121. Best Time to Buy and Sell Stock买卖股票的最佳时机
- C#《原CSharp》第四回 人常见岁月更替 却难知人文相继
- The fourth chapter of the original CSharp c # common years is hard to know the humanistic one after another
- 【My Diary】About my lovely new colleague
- 力扣第 305 场周赛
猜你喜欢

STM32F103C8/BT6 USART1 DMA发送失败

PC Museum (Fanwai 01)-Chenghuiwan, junior high school students develop a large-scale navigation game with physical scales

STFW3N150 Pin Function Datasheet (PDF) Pin Diagram

如何验证期货公司开户的正规性

PAT甲级 1056 Mice and Rice

Kubernetes技术与架构(八)

解决Mysql和redis缓存不一致问题

2022年最新《谷粒学院开发教程》:9 - 前台课程模块

Detailed QML ListView

杭电多校6 1009. Map
随机推荐
Embedded Interview Questions
【实战讲解】数据血缘落地实施
陈强教授《机器学习及R应用》课程 第五章作业
In-depth Synchronized various usage methods
【HDLBits 刷题 7】Circuits(3)Sequential Logic---Counters
three.js中射线对性能的影响
Spark基础【RDD分区和并行度】
Redis-事物
关于 globalThis is not defined 报错问题
C#《原CSharp》第四回 人常见岁月更替 却难知人文相继
从精装到智装,下一波浪潮浮现,听听智能家居的大咖们怎么说?
121. Best Time to Buy and Sell Stock买卖股票的最佳时机
PAT甲级 1055 The World‘s Richest
程序中的负数存储及类型转换
深入Synchronized各种使用方法
The futures company how to validate the normality of opening an account
Kubernetes Technology and Architecture (8)
sci 顶刊中的 3D 密度函数图
SDRAM详解
R语言统计与绘图:ROC曲线的统计计算