java 空對象代碼優化 jdk1.8

  • 空集合 --> 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");

         

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章