java8的Optional的用法
2021-06-12 01:03
标签:应用程序 表示 获取 指针 java 8 before 而不是 通过 ble 空指针异常是导致Java应用程序失败的最常见原因。以前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码。受到Google Guava的启发,Optional类已经成为Java 8类库的一部分。Optional实际上是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。 在Java 8之前,程序员将返回null而不是Optional。这种方法有一些缺点。一种是没有明确的方法来表示null可能是一个特殊值。相比之下,在API中返回Optional是明确的声明,其中可能没有值。如果我们要确保不会出现空指针异常,则需要对每个引用进行显式的空检查,如下所示,我们都同意这是很多样板。 为了简化此过程,让我们看一下如何使用Optional类,从创建和验证实例到使用它提供的不同方法并将其与返回相同类型的其他方法组合在一起,后者才是Optional的厉害之处。 Optional类提供了大约10种方法,我们可以使用它们来创建和使用Optional类,下面将介绍如何使用它们。 Optional.of()或者Optional.ofNullable():创建Optional对象,差别在于of不允许参数是null,而ofNullable则无限制。 Optional.empty():所有null包装成的Optional对象: ifPresent(Consumer consumer), 如果Optional对象保存的值不是null, 则调用consumer对象,否则不调用 注意:在调用get()方法之前, 一定要先进行isPresent()方法判断是否存在值 返回值(如果存在);反之,返回其他。 返回值(如果存在);否则,调用other并返回该调用的结果。 该orElseGet() 方法类似于 orElse()。但是,如果没有Optional值,则不采用返回值,而是采用供应商功能接口,该接口将被调用并返回调用的值: 那么,orElse() 和orElseGet()之间有什么区别。 乍一看,这两种方法似乎具有相同的效果。但是,事实并非如此。让我们创建一些示例,以突出两者之间的相似性和行为差异。 首先,让我们看看它们在对象为空时的行为: 在上面的示例中,我们在Optional对象中包装了一个空文本,然后尝试使用两种方法中的每一种来获取包装后的值。副作用如下: 在每种情况下都会调用默认方法。碰巧的是,当不存在包装的值时,两者 orElse() 和的 orElseGet() 工作方式完全相同。 值不存在则抛出异常,存在则什么不做,有点类似Guava的Precoditions 判断Optional对象中保存的值是否满足Predicate,并返回新的Optional。 对Optional中保存的值进行函数运算,并返回新的Optional(可以是任何类型) 功能与map()相似,差别请看如下代码。flatMap方法与map方法类似,区别在于mapping函数的返回值不同。map方法的mapping函数返回值可以是任何类型T,而flatMap方法的mapping函数必须是Optional。 java8的Optional的用法 标签:应用程序 表示 获取 指针 java 8 before 而不是 通过 ble 原文地址:https://blog.51cto.com/14901322/25211511. 在Optional之前
// Life before Optional
private void getIsoCode( User user){
if (user != null) {
Address address = user.getAddress();
if (address != null) {
Country country = address.getCountry();
if (country != null) {
String isocode = country.getIsocode();
if (isocode != null) {
isocode = isocode.toUpperCase();
}
}
}
}
}
2. 创建一个Optional类
1. Optional.of()
// 参数不能是null
Optional
2. Optional.ofNullable()
// 参数可以是null
Optional
3. Optional.empty()
Optional
3. 判断是否存在
1. isPresent()判断值是否存在
Optional
2. ifPresent(Consumer consumer)
Optional
5. 获取Optional里面的对象
1. get()
//get
Optional
2. orElse(value)
//orElse
String nullName = null;
String name = Optional.ofNullable(nullName).orElse("default_name");
3. orElseGet(Supplier supplier)
//orElseGet
String name = Optional.ofNullable(nullName).orElseGet(() -> "john");
String text = null;
String defaultText = Optional.ofNullable(text).orElseGet(this::getDefaultValue);
defaultText = Optional.ofNullable(text).orElse(getDefaultValue());
public String getDefaultValue() {
System.out.println("Getting Default Value");
return "Default Value";
}
Getting Default Value
Getting Default Value
4. orElseThrow()
Optional
5. 流处理
1. filter(Predicate)
Optional
2. map(Function):
Optional
3. flatMap()
Optional