遵义建设厅网站官网搞一个网站花多少钱
news/
2025/10/8 23:09:47/
文章来源:
遵义建设厅网站官网,搞一个网站花多少钱,广州最穷的三个区,华贸中心网站谁做的文章目录 1. 大概说明2. 详细分析2.1 .orElse 操作2.2 .orElse 的作用#xff1a;避免空指针异常2.3 为什么要用#xff1f;2.4 orElseGet如何使用2.5 orElse和orElseGet的区别 1. 大概说明
这篇文章的目的是为了说明#xff1a;
orElse 如何使用orElseGet 如何使用两者的… 文章目录 1. 大概说明2. 详细分析2.1 .orElse 操作2.2 .orElse 的作用避免空指针异常2.3 为什么要用2.4 orElseGet如何使用2.5 orElse和orElseGet的区别 1. 大概说明
这篇文章的目的是为了说明
orElse 如何使用orElseGet 如何使用两者的区别
备注orElse 可能导致 NullPointerException当 orElse 的参数是间接计算得来的时候。虽然这种说法有点牵强因为并不是orElse导致了空指针异常但是使用 orElseGet 确实可以避免这种情况。
2. 详细分析
2.1 .orElse 操作 先看个例子 OptionalString optional Optional.empty();
System.out.println(optional.isPresent); // ----输出false
// 返回 false表示 Optional 里没有值。解析 Optional.empty() 代表 一个空的 Optional 实例即 Optional 没有值。Optional.ofNullable(null) 等价于 Optional.empty()。 2.2 .orElse 的作用避免空指针异常
如果 Optional 为空即 Optional.empty()就返回 orElse() 里提供的默认值。如果 Optional 有值就直接返回这个值不执行 orElse() 提供的默认值。
注意不管 Optional 为不为空这个值都会创建只不过为空时才使用
// 举例当Optional为空时orElse()才会触发
String result Optional.ofNullable(null).orElse(默认值);
System.out.println(result); // ----输出默认值// 再举个例子
MapLong, ListString map new HashMap();
map.put(1L, Arrays.asList(A, B, C));ListString result Optional.ofNullable(map.get(1L)).orElse(Collections.emptyList()); // 为null就返回 空列表
System.out.println(result); // ----输出[A, B, C] orElse() 没起作用2.3 为什么要用
ListString result Optional.ofNullable(map.get(0L)).orElse(Collections.emptyList()).stream();如果 map.get(0L) null那么
不加 .orElse(Collections.emptyList()) → .stream() 会报 NullPointerException ❌加了 .orElse(Collections.emptyList()) → .stream() 能正常执行 ✅
2.4 orElseGet如何使用
再来看看 orElseGet 中如何使用
orElseGet 作用获取数据并且设置数据为空时的默认值。如果数据不为空就能获取到该数据如果为空则返回传入的参数来创建对象。
具体的使用案例可看下图 2.5 orElse和orElseGet的区别
orElse() 和 orElseGet() 都是Optional 类中的方法用于在 Optional 为空时提供默认值。但它们的区别在于 默认值的获取方式
1、orElse(T other)
直接传递一个默认值即使 Optional里有值也会创建 other 对象但不会使用它适用于默认值创建代价较低的情况
2、orElseGet(Supplier? extends T supplier)
传递的是一个 Supplier懒加载只有需要的时候才会创建接口它是一个函数式接口形式是这样的()-{ return computedResult }即入参为空有返回值任意类型的仅当 Optional 为空时才会执行 supplier.get()不会提前创建默认值适用于默认值创建代价较高的情况
看个例子
class User {// 中文名private String chineseName;// 英文名private EnglishName englishName;
}class EnglishName {// 全名private String fullName;// 简写private String shortName;
}假如我们现在有 User 类用户注册账号时需要提供自己的中文名或英文名或都提供我们抽象出一个EnglishName 类它包含英文名的全名和简写因为有的英文名确实太长了。现在我们希望有一个User.getName() 方法它可以像下面这样实现
class User {// ... 之前的内容public String getName1() {return Optional.ofNullable(chineseName).orElse(englishName.getShortName());}public String getName2() {return Optional.ofNullable(chineseName).orElseGet(() - englishName.getShortName());}
}写了两个版本分别使用 orElse 和 orElseGet。现在你可以看出 getName1() 方法有什么风险了吗它会出现空指针异常吗---- 是的。当用户只提供了中文名时此时 englishName 属性是 null但是在 orElse 中englishName.getShortName()总是会执行。而在 getName2() 中这个风险却没有。
再举个例子
public class Test {public static void main(String[] args) {System.out.println(orElse() 的情况);String result1 Optional.ofNullable(实际值).orElse(test2());System.out.println(最终结果: result1);System.out.println(orElseGet() 的情况);String result2 Optional.ofNullable(实际值).orElseGet(() - test2());System.out.println(最终结果: result2);}public static String test2() {System.out.println(执行昂贵的计算...);return 昂贵默认值;}
}输出
orElse() 的情况
执行昂贵的计算...
最终结果: 实际值orElseGet() 的情况
最终结果: 实际值至此文章结束记得点赞收藏评论
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/932042.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!