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 *
-
标签:map,null,System,规避,println,out,Optional,Java8,指针 来源: https://www.cnblogs.com/deepblueskysea/p/15122890.html