public static Optional<Insurance> getInsuranceOpt(Optional<Person> person,Optional<Car> car){
if(person.isPresent() && car.isPresent()){
return Optional.of(getInsurance(person.get(),car.get()));
}
return Optional.empty();
}
这看起来好了很多,更优雅的方式:
public static Optional<Insurance> getInsuranceOpt1(Optional<Person> person, Optional<Car> car) {
return person.flatMap(p -> car.map(c -> getInsurance(p, c)));
}
如果p为空,不会执行返回空的Optional对象。如果car为空也不会执行 返回空Optional对象。 如果都有值那么调用这个方法。
filter剔除特定的值
除了map和flatMap方法类似流中的操作,还有filter方法。使用filter可以快速判断Optional对象中是否包含指定的规则,如:
Insurance insurance = new Insurance();
if(insurance != null && insurance.getName().equals("abc")){
System.out.println("is abc");
}
可以使用filter改写为:
Optional<Insurance> insuranceOpt = Optional.of(insurance);
insuranceOpt.filter(c->c.getName().equals("abc")).ifPresent(x->System.out.println(x));
用Optional改善你的代码
我们虽然很难对老的Java API进行改动,但是可以再自己的代码中添加一些工具方法,来修复或者绕过这些问题,容纳给你的代码享有Optional带来的威力。
使用Optional封装可能为null的值
现存的Java API几乎都是通过返回一个null的方式来表示需要值的缺失,或者由于某些原因计算无法得到该值。比如,如果Map中不含指定的键对应的值,它的get就会返回一个null。我们想在这种情况下返回Optional对象是很容易的。
Object value = new HashMap<String,Object>().get("key"); //null
有两种方式转换为Optional对象,第一种就是if else 方式,显然很笨重。第二种就是使用ofNullable方法。
Optional<Object> value = Optional.ofNullable(new HashMap<String,Object>().get("key"));
每次你希望安全的对潜在为null的对象进行转换时,都可以先将其转换为Optional对象。
异常与Optional
由于某种原因,函数无法返回某个值,这时除了返回null,还会抛出一个异常。典型的例子是Integer.parseInt(String),将String转换为int。如果String无法解析为整型,就会抛出NumberFormatException异常。一般做这个操作,我们会加入 try/catch来避免程序挂掉,而不是用if来判断。
使用Optional对象对遭遇无法转换的String返回非法值进行建模,这时你期望parseInt的返回值是一个optional。虽然我们无法改变以前的方法,但我们可以创建一个工具方法:
public static Optional<Integer> StringToInt(String s){
try{
return Optional.of(Integer.parseInt(s));
}catch (Exception ex){
return Optional.empty();
}
}
我们可以建立一个OptionalUtils工具类,然后对所有的类似转换操作创建方法。然后在需要的地方 OptionalUtils.StringToInt(Stirng);
基础类型的Optional对象
与Stream对象一样,Optional对象也提供了类似的基础类型:OptionalInt、OptionalDouble、OptionalLong。 但是这三个基础类型不支持map、flatMap、filter方法。
小结:
1.null引用在历史上被引入到程序设计语言中,目的是为了表示变量值的缺失。
2.Java 8中加入了一个新的类 java.util.Optional<T> 对存在或缺失的变量进行建模。
3.你可以使用静态工厂方法Optional.empty、Optional.of、Optional.ofNullable创建Optional对象。
4.Optional支持多种方法,比如map、flatMap、filter,他们在概念上与Stream类似。
5.使用Optional会迫使你更积极的引用Optional对象,以及应对变量缺失的问题,最终你能更有效的防治代码中出现空指针异常。
6.使用Optional能帮助你更好的设计API,用户只需要参阅签名酒知道该方法是否接受一个Optional。
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx