Java8空指针规避技巧

时间:2021-08-10
本文章向大家介绍Java8空指针规避技巧,主要包括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()方法替代
  • 确保比较类型一致,比如最经典的Integerint比较在超过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