java8 nullpoint_使用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类实例方法截了图

3f4795cd0263904447f33683dd5a9c83.png

optional构造函数

1:空值optional

optionaloptcar = optional.empty();

2:非空值optional,传空抛异常

optionaloptcar = optional.of(car);

3:可接受null的optional

optionaloptcar = optional.ofnullable(car);

使用map从optional中取值和转换值

optionaloptinsurance = optional.ofnullable(insurance);

optionalname = optinsurance.map(insurance::getname);

使用flatmap转换optional

optionaloptcar= person.flatmap(person::getcar);

optional= optcar.flatmap(car::getinsurance)

map和flatmap区别:

optional<>> car = optperson.map(person::getcar);optionalcar1 = optperson.flatmap(person::getcar);

ifpresent:如果值存在就会执行回调,否则什么也不干

optcar.ifpresent(car::getinsurance);

ispresent:值存在返回true,否则false

boolean = optcar.ispresent;

orelse:有值则返回,否则返回一个默认值

string name = optcar.map(insurance::getname)

.orelse("unknown");

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;

}

好了,通过上面的这些例子可以帮助我们更优雅的处理nullpointexception,祝福各位撸的愉快

希望与广大网友互动??

点此进行留言吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值