使用java8中的Optional API解决nullPointException问题
今天和大家一起使用java8中的optional api解决nullpointexception,
先来看一段代码:
public class car { private insurance insurance; public insurance getinsurance() { return insurance; } } public class insurance { private string name; public string getname() { return name; } } public class person { private car car; public car getcar() { return car; } } public string getcarinsurancename(person p){ return p.getcar().getinsurance().getname(); }
这个getcarinsurancename()方法一看就知道可能有nullpointexception
通常我们这样处理:
public string getcarinsurancename(person p){ if(p!=null){ car car = p.getcar(); if(car!=null){ insurane insurance = car.getinsurance(); if(insurance!=null){ return insurance.getname(); } } } return "unknow"; }
public class person { private optional car; public optional getcar() { return car; } } public class car { private optional insurance; public optional getinsurance() { return insurance; } } public class insurance { private string name; public string getname() { return name; } } public string getcarinsurancename(optionalperson) { return person.flatmap(person::getcar) .flatmap(car::getinsurance) .map(insurance::getname) .orelse("unknown"); }
一脸懵逼有没有?好的大王,不管你有没有被征服,反正我是被臣妾是要开始
娓娓道来了。
上面的getcarinsurancename方法的几个关键点:
1:使用lambda表达式(不会的请恶补上篇文章)
2:使用java.util.optional对person类中的car类和car类中的insurance类包装
3:使用java.util.optional 中流式api处理数据(类似rxjava或者java.util.steam)
偷偷的把optional类实例方法截了图
optional构造函数
1:空值optional
optional
2:非空值optional,传空抛异常
optional
3:可接受null的optional
optional
使用map从optional中取值和转换值
optional
optional
使用flatmap转换optional
optional
optional
map和flatmap区别:
optional
optional optcar.ifpresent(car::getinsurance); boolean = optcar.ispresent; string name = optcar.map(insurance::getname) .orelse("unknown"); 好了,通过上面的这些例子可以帮助我们更优雅的处理nullpointexception,祝福各位撸的愉快ifpresent:如果值存在就会执行回调,否则什么也不干
ispresent:值存在返回true,否则false
orelse:有值则返回,否则返回一个默认值
andthen,再来个filter的例子
@requiresapi(api = build.version_codes.n)
public static void main(string[] args) {
properties properties = new properties();
properties.setproperty("a", "5");
properties.setproperty("b", "-1");
properties.setproperty("c", "true");
system.out.println(readduration(properties,"a"));
system.out.println(readduration(properties,"b"));
system.out.println(readduration(properties,"c"));
optionalint.of(1).
}
@requiresapi(api = build.version_codes.n)
public static int readduration(properties properties, string name) {
return optional.ofnullable(properties.getproperty(name))
.flatmap(s -> parsestring(s))
.filter(i -> i > 10)
.orelse(0);
}
@requiresapi(api = build.version_codes.n)
public static optional parsestring(string s) {
optional optionalint;
try {
optionalint = optional.of(integer.parseint(s));
} catch (numberformatexception e) {
optionalint = optional.empty();
}
return optionalint;
}
推荐阅读
-
chrome浏览器中无法使用QQ快速登录问题的解决方法
-
解决Vue2.0中使用less给元素添加背景图片出现的问题
-
总结Nginx 的使用过程中遇到的问题及解决方案
-
Python中循环后使用list.append()数据被覆盖问题的解决
-
使用jQuery快速解决input中placeholder值在ie中无法支持的问题
-
Python的Flask框架中SQLAlchemy使用时的乱码问题解决
-
Android 使用volley过程中遇到的问题解决办法
-
html5的input的required使用中遇到的问题及解决方法
-
使用vue-cli打包过程中的步骤以及问题的解决
-
web.py在SAE中的Session问题解决方法(使用mysql存储)