凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 85552
  • 博文数量: 165
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1655
  • 用 户 组: 普通用户
  • 注册时间: 2022-09-26 14:37
文章分类

全部博文(165)

文章存档

2024年(2)

2023年(95)

2022年(68)

我的朋友
相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: java

2022-09-29 11:22:40

optional源码解析与实践-凯发app官方网站

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)方法说明

  • map(function mapper): 如果存在一个值,则对其应用提供的映射函数,如果结果非空,则返回描述结果的optional。 否则返回一个空的optional。
  • flatmap(function< t,optional> mapper): 如果有值,则对其应用提供的可选映射函数,返回结果,否则返回空的可选函数。 这个方法类似于map(function),但是提供的映射器的结果已经是一个可选的,如果调用,flatmap不会用额外的可选的包装它。
  • 区别:map会自动将u放到optional中,而flatmap则需要手动给u创建一个optional

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)运行结果


  • 由于optional并没有实现serializable接口,所以不能作为类的属性。
  • 不要把optional作为方法的参数。
  • 把if(x!=null)直接换成optional.ofnullable(x).ispresent(),这样有过度编码的嫌疑。
  • 直接使用optional.get()的返回值进行操作,string result =optional.ofnullable(null).get().tostring();这样还是会抛出异常的。

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值判断代码,让代码变得更加优雅和整洁。


作者:陈昌浩

阅读(309) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图