欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java 空对象代码优化 jdk1.8

程序员文章站 2022-01-05 10:51:13
...
  • 空集合 --> CollectionUtils.isEmpty();
  • 空对象
    • 判断对象是否为空 Objects.isNull(); 在加判断
    • 使用Optional优化 --> 它只适用于”是否存在”的场景。
      • 只有当考虑对象返回null是合理的情况下,才进行Optional的返回.  集合不建议使用

      • ifPresent() 方法:检查是否有值的另一个选择是 ifPresent() 方法。该方法除了执行检查,还接受一个Consumer(消费者) 参数,如果对象不是空的,就对执行传入的 Lambda 表达式:

        • @Test
            public void shouldConvertDTO(){
          
              PersonDTO personDTO = new PersonDTO();
          
              Optional.ofNullable(getPerson()).ifPresent(person -> {
                personDTO.setDtoAge(person.getAge());
                personDTO.setDtoName(person.getName());
              });
            }
          
            private Person getPerson(){
              return null;
            }
          
          这个例子中,只有Person对象不为 null 的时候才会执行断言。
          
          
      • 返回默认值 orElse() 和 orElseGet()
        • orElse()   如果有值则返回该值,否则返回传递给它的参数值,如果对象的初始值不是 null,那么默认值会被忽略
          • @Test
            public void whenEmptyValue_thenReturnDefault() {
                User user = null;
                User user2 = new User("1234", "1234");
                User result = Optional.ofNullable(user).orElse(user2);
            
                assertEquals(user2.getEmail(), result.getEmail());
            }
        • orElseGet()  其行为略有不同。这个方法会在有值的时候返回值,如果没有值,它会执行作为参数传入的 Supplier(供应者) 函数式接口,并将返回其执行结果
          • User result = Optional.ofNullable(user).orElseGet( () -> user2);

             

        • 相同不同之处:

          • Optional 为空的时候没有区别,都会执行后面的方法.

          • Optional  不为空时,orElse()仍会执行后面的方法.orElseGet()则不会

      • orElseThrow() 它会在对象为空的时候抛出异常,而不是返回备选的值

        • @Test(expected = IllegalArgumentException.class)
          public void whenThrowException_thenOk() {
              User result = Optional.ofNullable(user)
                .orElseThrow( () -> new IllegalArgumentException());
          }

          这里,如果 user 值为 null,会抛出 IllegalArgumentException

          这个方法让我们有更丰富的语义,可以决定抛出什么样的异常,而不总是抛出 NullPointerException

    • 转换值

      • map:

        • @Test
          public void whenMap_thenOk() {
              User user = new User("[email protected]", "1234");
              String email = Optional.ofNullable(user)
                .map(u -> u.getEmail()).orElse("[email protected]");
          
              assertEquals(email, user.getEmail());
          }

           

    • 过滤值

      • Optional  类也提供了按条件“过滤”值的方法

        • filter() 接受一个 Predicate 参数,返回测试结果为 true 的值。如果测试结果为 false,会返回一个空的 Optional

        • @Test
          public void test() {
              User user = new User("1234", "1234");
              Optional<User> result = Optional.ofNullable(user)
                .filter(u -> u.getEmail() != null && u.getEmail().contains("@"));
          
              assertTrue(result.isPresent());
          }

           

    • 使用示例:

      • String isocode = user.getAddress().getCountry().getIsocode().toUpperCase();
        
        增加if判断null
        if (user != null) {
            Address address = user.getAddress();
            if (address != null) {
                Country country = address.getCountry();
                if (country != null) {
                    String isocode = country.getIsocode();
                    if (isocode != null) {
                        isocode = isocode.toUpperCase();
                    }
                }
            }
        }
        
        优化:
        @Test
        public void whenChaining_thenOk() {
            User user = new User("[email protected]", "1234");
        
            String result = Optional.ofNullable(user)
              .flatMap(u -> u.getAddress())
              .flatMap(a -> a.getCountry())
              .map(c -> c.getIsocode())
              .orElse("default");
        
            assertEquals(result, "default");
        }
        
        方法引用在调整
        String result = Optional.ofNullable(user)
          .flatMap(User::getAddress)
          .flatMap(Address::getCountry)
          .map(Country::getIsocode)
          .orElse("default");

         

相关标签: Optional