分类: java
2022-09-29 11:22:40
nullpointerexception在开发过程中经常遇到,稍有不慎小bug就出现了,如果避免这个问题呢,optional就是专门解决这个问题的类,那么optional如何使用呢?让我们一起探索一下吧!
optional类是java8为了解决null值判断问题而创建的容器类,在java.util 下,使用optional类可以避免显式的null值判断,避免null导致的nullpointerexception。首先,optional是一个容器,它可以保存类型t的值,也可以为null的容器对象。optional容器只能存一个值。
1)源码:
/**
* common instance for {@code empty()}.
*/ private static final optionalsuper t> predicate) {
objects.requirenonnull(predicate); if (!ispresent()) return this; else return predicate.test(value) ? this : empty();
}
2)方法说明
filter(predicate p): 如果optional不为空,则执行predicate p,如果p的结果为true,则返回原本的optional,否则返回空的optional
3)测试代码
public static void main(string[] args) {
integer value1 = 5;
integer value2 = 6;
optional optional1 = optional.ofnullable(value1);
optional optional2 = optional.of(value2);
optional result =optional1.filter(t->t > 5);
system.out.println("optional1的filter后的值:" result);
result =optional2.filter(t->t > 5);
system.out.println("optional2的filter后的值:" result);
4)运行结果
1)源码
public optional map(functionsuper t, ? extends u> mapper) {
objects.requirenonnull(mapper); if (!ispresent()) return empty(); else { return optional.ofnullable(mapper.apply(value));
}
} public optional flatmap(functionsuper t, optional> mapper) {
objects.requirenonnull(mapper); if (!ispresent()) return empty(); else { return objects.requirenonnull(mapper.apply(value));
}
}
2)方法说明
3)测试代码
public static void main(string[] args) {
user user1 = null;
user user2 = new user("user2名字",19);
optional optional1 = optional.ofnullable(user1);
optional optional2 = optional.of(user2);
system.out.println("=========map==========");
system.out.println("optional1的map前的值:" optional1);
optional result =optional1.map(t->t.getname());
system.out.println("optional1的map后的值:" result);
system.out.println("optional2的map前的值:" optional2);
result =optional2.map(t->t.getname());
system.out.println("optional2的map后的值:" result);
system.out.println("===========flatmap========");
system.out.println("optional1的flatmap前的值:" optional1);
optional result2 =optional1.flatmap(t->optional.ofnullable(t.getage()));
system.out.println("optional1的flatmap后的值:" result2);
system.out.println("optional2的flatmap前的值:" optional2);
result2 =optional2.flatmap(t->optional.ofnullable(t.getage()));
system.out.println("optional2的flatmap后的值:" result2);
} public class user {
string name;
integer age; public user(string name,integer age){ this.name = name; this.age=age;
} public string getname() { return name;
} public integer getage() { return age;
4)运行结果
a类有属性b类,b类有属性c类,c类有name这个字段。
使用optional之前:
if(atest!=null){ btest btest =atest.getbtest(); if(btest!=null){ ctest ctest = btest.getctest(); if (ctest != null) { name =ctest.getname(); } } }
使用optional之后:
name = optional.ofnullable(atest).map(t->t.getbtest()).map(t->t.getctest()).map(t->t.getname()).orelse("默认值");
代码是不是看上去更整洁了呢?
通过对optional源码解析和用例测试代码的运行结果,可以看出使用optional可以优化null值判断代码,让代码变得更加优雅和整洁。
作者:陈昌浩