首页 > 其他 > 详细

optional杜绝空指针异常

时间:2020-10-28 09:13:38      阅读:28      评论:0      收藏:0      [点我收藏+]
optional杜绝空指针异常

1.友情链接

目录
可直接运行的完整代码
视频讲解
文字版

如果有帮助到你的话请顺手点个赞、加个收藏这对我真的很重要

2.建立Child、Parent、GrandParent的层级

Child

@Data
@AllArgsConstructor
@ToString(callSuper = true)
@NoArgsConstructor
@Accessors(chain = true)
public class Child {
    private List<String> list;
    private String str;
}

GrandParent

@Data
@AllArgsConstructor
@ToString(callSuper = true)
@NoArgsConstructor
@Accessors(chain = true)
public class GrandParent {
    private Parent parent;
}

Parent

@Data
@AllArgsConstructor
@ToString(callSuper = true)
@NoArgsConstructor
@Accessors(chain = true)
public class Parent {
    private Child child;
}

测试类

	GrandParent opt1 = null;
        String opt1Str =
                Optional.ofNullable(opt1).map(o1 -> o1.getParent())
                        .map(o2 -> o2.getChild()).map(l->l.getStr()).orElse(null);
        System.out.println(String.format("%s:%s", "opt1Object", opt1Str));

        GrandParent opt2 = null;
        List<String> opt2list =
                Optional.ofNullable(opt2).map(o1 -> o1.getParent())
                        .map(o2 -> o2.getChild()).map(l->l.getList()).orElse(null);
        System.out.println(String.format("%s:%s", "opt2list", opt2list));

        GrandParent opt3 = new GrandParent().setParent(new Parent().setChild(new Child().setStr("ssss").setList(Stream.of("1", "2").collect(Collectors.toList()))));
        List<String> opt3list =
                Optional.ofNullable(opt3).map(o1 -> o1.getParent())
                        .map(o2 -> o2.getChild()).map(l->l.getList()).orElse(null);
        String opt3Str =
                Optional.ofNullable(opt3).map(o1 -> o1.getParent())
                        .map(o2 -> o2.getChild()).map(l->l.getStr()).orElse(null);
        System.out.println(String.format("%s:%s", "opt3list", opt3list));
        System.out.println(String.format("%s:%s", "opt3Str", opt3Str));

输出结果

opt1Object:null
opt2list:null
opt3list:[1, 2]
opt3Str:ssss

可以发现嵌套类无论是string还是list,中间任何一个类为null都会直接返回null,而不用去多层嵌套if这种很蠢的做法

3.非常规复杂optional用法

当然平常时候总会遇到一些奇奇怪怪的结果,例如查询数据库会返回List<Map<String, String>>这样的结构,也是可以用Optinoal做的

        List<Map<String, String>> listR = null;
        String result = Optional.ofNullable(listR).flatMap(l -> l.stream().findAny())
                .flatMap(l -> l.keySet().stream().findAny()).orElse(null);
        System.out.println(result);
        listR = new ArrayList<Map<String, String>>();
        result = Optional.ofNullable(listR).flatMap(l -> l.stream().findAny())
                .flatMap(l -> l.keySet().stream().findAny()).orElse(null);
        System.out.println(result);
        listR = new ArrayList<Map<String, String>>() {{
            add(new HashMap<String, String>());
        }};
        result = Optional.ofNullable(listR).flatMap(l -> l.stream().findAny())
                .flatMap(l -> l.keySet().stream().findAny()).orElse(null);
        System.out.println(result);
        listR = new ArrayList<Map<String, String>>() {{
            add(new HashMap<String, String>() {{
                put("C", "0");
            }});
        }};
        result = Optional.ofNullable(listR).flatMap(l -> l.stream().findAny())
                .flatMap(l -> l.keySet().stream().findAny()).orElse(null);
        System.out.println(result);

输出结果如下:

null
null
null
C

4.其它优秀杜绝空指针异常的优秀方法

首先是lombok的@NonNull,这个可以作用于方法参数上,如果传入空则直接抛异常,并在日志精准打印出异常位置及情况,非常适合校验参数,增加代码简洁性

当然刚才写的类还是返回了null,但是没关系,可以用以下工具类,在各种情况下都可以抛出自定义异常或直接return出去

System.out.println(String.format("%s:%s", "StringUtils", StringUtils.isBlank(null)));
System.out.println(String.format("%s:%s", "defaultIfNull", ObjectUtils.defaultIfNull(null, "defaultIfNull")));
List list = null;
Map map = null;
Set set = null;
String[] arr = null;
System.out.println(String.format("%s:%s", "list", CollectionUtils.isEmpty(list)));
System.out.println(String.format("%s:%s", "map", CollectionUtils.isEmpty(map)));
System.out.println(String.format("%s:%s", "set", CollectionUtils.isEmpty(set)));
System.out.println(String.format("%s:%s", "arr", ArrayUtils.isEmpty(arr)));

输出结果如下:

StringUtils:true
defaultIfNull:defaultIfNull
list:true
map:true
set:true
arr:true

optional杜绝空指针异常

原文:https://www.cnblogs.com/sealLee/p/13888669.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!