Java8空指针规避技巧
Java8空指针规避技巧
一、字符串equals
-
确保
obj.equals(target)
的obj对象不会为null,比如"test".equals(target)
-
使用
Objects.equals()
替代a.equals("test")
; -
public Tank createTank(String check){ Tank tank = null; if(Objects.equals(check, "my")){ tank = new MyTank(); }else if(Objects.equals(check, "mouse")){ tank = new MouseTank(); }else if (Objects.equals(check, "big")){ tank = new BigTank(); }else { throw new UnsupportedOperationException("unsupport"); } return tank; }
二、变量 ==
操作
- 使用
Objects.equals()
方法替代 - 确保比较类型一致,比如最经典的Integer和int比较在超过127的时候为false的问题
三、集合元素为null
-
使用
Stream.filter
进行过滤 -
这里使用了StringUtils::isNotBlank来判断是否为空字符串并过滤掉所有的空字符串和Null元素
@Test
public void test2(){
List<String> list = Arrays.asList("1", null, "2", "", "3");
System.out.println(list.size());
List<String> collect = list.stream().filter(StringUtils::isNotBlank).collect(Collectors.toList());
System.out.println(collect.size());
}/*运行结果
5
3
*/
四、map的元素值为null
-
map也是容易出现null的,比如下面这种情况,一旦get()的返回结果为null,就会出现空指针的异常情况
-
map.get("user").getName()
-
-
使用MapUtils获取元素,使用的时候小心自动装箱的性能和效率问题
-
每次获取之前需要判断是否为空
-
@Test public void test1(){ Map<String, Object> keyVal = new HashMap<>(); keyVal.put("name","value"); keyVal.put("yes", new Object()); keyVal.put("intval1", 1); Object val1 = MapUtils.getObject(null, "yes"); Object val2 = MapUtils.getObject(keyVal, "yes"); String str1 = MapUtils.getString(keyVal, "name"); int int1 = MapUtils.getInteger(keyVal, "intval1"); System.out.println(val1); System.out.println(val2); System.out.println(str1); System.out.println(int1); }
五、类型强转为Null
-
json转换为null,如果传入空字符串,会导致转化的结果是一个Null值
-
在转化的地方要么对于字符串做判断是否为空的操作
-
或者对于转换后的对象进行判空
-
@Test public void test3(){ String str = "{\"name\":\"123\"}"; String str2 = "{\"email\":\"123\"}"; String str3 = ""; User map = JSON.parseObject(str, User.class); User email = JSON.parseObject(str2, User.class); User user2 = JSONObject.parseObject(str3, User.class); System.out.println(Objects.isNull(map)); System.out.println(Objects.isNull(email)); System.out.println(Objects.isNull(user2)); }/*运行结果 true true false */
六、Optional工具类
-
Optional.ofNullable()封装可能为null的值
-
Optional<Object> value = Optional.ofNullable(map.get("user"));
-
-
Optional.empty():创建一个空的Optional,这种方式是返回一个空Optional,等效Optional.ofNullable(null)
-
Optional<Object> empty = Optional.empty();
-
-
Optional.of():表示创建一个不允许是空值的Optional,如果传入为Null会抛出异常
-
Optional<Object> notNull = Optional.of(new Object());
-
-
Optional.flatMap 根据 Optional 的结果获取参数
-
List<String> stringList = new ArrayList<>(); stringList.add("name1"); stringList.add("testone"); stringList.add("other"); // 使用flatMap处理Optional的返回结果 Optional<String> stringOptional = Optional.of(u1).flatMap(u -> Optional.ofNullable(u1.getName())); System.out.println("flatMap" + stringOptional);
-
-
Optional.map 使用map收集某一个对象的值
-
User user = new User(); Optional<User> notNull = Optional.ofNullable(user); Integer age = notNull.map(User::getAge).orElse(22); String name = notNull.map(User::getName).orElse("myname"); System.out.println(age); // Optional.map 收集某一个对象的值 System.out.println("Optional.map 收集某一个对象的值:"+ age); System.out.println("Optional.map 收集某一个对象的值:"+ name);
-
Optional.isPresent校验对象是否存在,存在返回true
-
// 对象属性是否存在 Optional<Object> notNull = Optional.of(new Integer(4)); boolean present = notNull.isPresent(); System.out.println("notNull 值是否不为空 " + present); Optional<Object> nullAble = Optional.ofNullable("sss"); System.out.println("nullAble 是否不为空 "+ nullAble.isPresent()); /**运行结果: notNull 值是否不为空 true nullAble 是否不为空 true */
-
-
Optional.orElse 如果为空返回默认值,不为空不做处理
-
Optional<Object> integerNull = Optional.ofNullable(null); Object o = integerNull.orElse("22"); System.out.println("o 否则返回默认值 " + o); /**运行结果: o 否则返回默认值 22 */
-
-
Optional.get 对象必须存在
-
Optional<Object> integerNull2 = Optional.ofNullable(null); // 抛出异常 java.util.NoSuchElementException: No value present // 来源:throw new NoSuchElementException("No value present"); // Object o1 = integerNull2.get(); Optional<Object> integerNull3 = Optional.ofNullable(12321); System.out.println("Optional.get 必须存在"+ integerNull3.get()); /**运行结果: Optional.get 必须存在12321 *
-
-
Optional.orElseGet 通过方法提供值
-
Optional<Object> integerNull4 = Optional.ofNullable(12321); Object o1 = integerNull4.orElseGet(() -> String.valueOf(22)); System.out.println("Optional.orElseGet 通过方法提供值" + o1); /**运行结果: Optional.orElseGet 通过方法提供值12321 *
-
-
Optional.orElseThrow 如果获取为null,抛出指定异常
-
Optional<Object> integerNull5 = Optional.ofNullable(null); Object orElseThrow = integerNull5.orElseThrow(() -> new RuntimeException("当前运行代码有误")); System.out.println("Optional.orElseThrow 自定义异常" + orElseThrow); /**运行结果: Optional.orElseThrow 自定义异常 当前运行代码有误 java.lang.RuntimeException: 当前运行代码有误 *
-
Optional.isPresent 使用ifPresent()来进行对象操作,存在则操作,否则不操作
-
integerNull5.ifPresent((item) -> { System.err.println("Optional.isPresent 如果存在对象,执行如下操作"); }); /**运行结果: Optional.isPresent 如果存在对象,执行如下操作 *
-
Optional.filter 操作,可以过滤出符合条件的内容
-
Optional<String> optional = Optional.of("testNAME"); String result = optional.filter(str -> str.contains("test")).orElse("not found"); System.out.println("Optional.filter 过滤出符合条件的对象: " + result); /**运行结果: Optional.filter 过滤出符合条件的对象: testNAME *
-
原文地址:https://www.cnblogs.com/deepblueskysea/p/15122890.html
- EntityFrameWork实现部分字段获取和修改(含源码)
- 基于Ado.Net的日志组件
- Do you kown Asp.Net Core -- 配置Kestrel端口
- 【翻译】在Visual Studio中使用Asp.Net Core MVC创建第一个Web Api应用(二)
- 微信快速开发框架(一)-- 对微信公众平台开发的消息处理
- 微信快速开发框架(二) -- 快速开发微信公众平台框架---简介
- LayoutInflater 布局渲染工具原理分析
- 使用Keras在训练深度学习模型时监控性能指标
- 微信快速开发框架(四)-- 体验微信公众平台快速开发框架
- AsyncTask源码解析
- 微信快速开发框架(五)-- 利用快速开发框架,快速搭建微信浏览博客园首页文章
- 对于小批量梯度下降以及如何配置批量大小的入门级介绍
- 数据结构之二叉树
- 微信快速开发框架(六)-- 微信快速开发框架(WXPP QuickFramework)V2.0版本上线--源码已更新至github
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Linux(Centos7.X ) 配置Java 环境变量
- CNS图表复现05—免疫细胞亚群再分类
- PAT (Basic Level) Practice (中文)1015 德才论 (25 分)
- 前端下载二进制流文件
- element-ui 表格打印
- PAT (Basic Level) Practice (中文)1016 部分A+B (15 分)
- 【Linux_Shell 脚本编程学习笔记二、打印菜单】
- PAT (Basic Level) Practice (中文)1017 A除以B (20 分)
- git commit 提交规范
- 非常量的引用左值问题
- PAT (Basic Level) Practice (中文)1019 数字黑洞 (20 分)
- 从 12.9K 开源项目学到的新东西
- PAT (Basic Level) Practice (中文)1048 数字加密 (20 分)
- 一、类加载的双亲委托机制详解
- PAT (Basic Level) Practice (中文)1021 个位数统计 (15 分)