- 空集合 --> 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()則不會
-
- orElse() 如果有值則返回該值,否則返回傳遞給它的參數值,如果對象的初始值不是 null,那麼默認值會被忽略
-
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");
-
java 空對象代碼優化 jdk1.8
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.