Table of Contents
ToggleJava Optional Methods
程式開發時,經常會碰到 NullPointerException 的例外,如果沒有去檢查這些空值,就很難避免發生系統崩潰,因此使用 Optional 可以指定要返回的替代值或要運行的替代程式碼,讓程式碼更具可讀性, Optional Java Methods 介紹常見的 of 、 get 、 isPresent 、 ifPresent 等方法,了解 Optional 的不同操作和方法,本篇增加了範例,並透過單元測試來驗證產出結果。
檔案目錄
./
+- src
+- test
| +- org
| +- ruoxue
| +- java_147
| +- optional
| +- OptionalMethodsTest.java
單元測試
Optional Java Methods 提供建立、取得、判斷是否存在等操作 Optional 。
empty
建立空的 Optional 容器。
@Test
public void empty() {
Optional<String> emptyOpt = Optional.empty();
System.out.println(emptyOpt);
assertFalse(emptyOpt.isPresent());
System.out.println(emptyOpt);
emptyOpt = Optional.ofNullable(null);
assertFalse(emptyOpt.isPresent());
}
Optional.empty
Optional.empty
of
建立 Optional 容器,內有字串、整數、及集合等不同類型物件。
@Test
public void of() {
Optional<String> opt = Optional.of("Beef");
System.out.println(opt);
assertTrue(opt.isPresent());
Optional<Integer> intOpt = Optional.of(147);
System.out.println(intOpt);
assertTrue(intOpt.isPresent());
Optional<List<String>> listOpt = Optional.of(new ArrayList<>(Arrays.asList("Beef", "Chicken", "Duck")));
System.out.println(listOpt);
assertTrue(listOpt.isPresent());
}
Optional[Beef]
Optional[147]
Optional[[Beef, Chicken, Duck]]
ofThrowException
建立 Optional 容器,傳入參數 null ,會拋出例外 。
@Test(expected = NullPointerException.class)
public void ofThrowException() {
Optional<String> opt = Optional.of(null);
assertFalse(opt.isPresent());
}
java.lang.NullPointerException
at java.util.Objects.requireNonNull(Objects.java:203)
at java.util.Optional.<init>(Optional.java:96)
at java.util.Optional.of(Optional.java:108)
at org.ruoxue.java_147.optional.OptionalMethodsTest.ofThrowException(OptionalMethodsTest.java:43)
ofNullable
Optional Methods Java 建立 Optional 容器,可傳入參數 null 。
@Test
public void ofNullable() {
Optional<String> opt = Optional.ofNullable("Beef");
System.out.println(opt);
assertTrue(opt.isPresent());
Optional<Integer> intOpt = Optional.ofNullable(147);
System.out.println(intOpt);
assertTrue(intOpt.isPresent());
Optional<List<String>> listOpt = Optional.ofNullable(new ArrayList<>(Arrays.asList("Beef", "Chicken", "Duck")));
System.out.println(listOpt);
assertTrue(listOpt.isPresent());
Optional<Object> objOpt = Optional.ofNullable(null);
System.out.println(objOpt);
assertFalse(objOpt.isPresent());
}
Optional[Beef]
Optional[147]
Optional[[Beef, Chicken, Duck]]
Optional.empty
get
Optional Methods Java 建立 Optional 容器,取得容器內的值。
@Test
public void get() {
Optional<String> opt = Optional.of("Beef");
System.out.println(opt);
String result = opt.get();
System.out.println(result);
assertEquals("Beef", result);
Optional<Integer> intOpt = Optional.of(147);
System.out.println(intOpt);
int intResult = intOpt.get();
System.out.println(intResult);
assertEquals(147, intResult);
Optional<List<String>> listOpt = Optional.of(new ArrayList<>(Arrays.asList("Beef", "Chicken", "Duck")));
System.out.println(listOpt);
List<String> listResult = listOpt.get();
System.out.println(listResult);
assertEquals(3, listResult.size());
}
Optional[Beef]
Beef
Optional[147]
147
Optional[[Beef, Chicken, Duck]]
[Beef, Chicken, Duck]
getThrowException
Optional Methods Java 建立 Optional 容器,取得容器內的 null 值,會拋出例外。
@Test(expected = NoSuchElementException.class)
public void getThrowException() {
Optional<String> opt = Optional.ofNullable(null);
System.out.println(opt.get());
assertFalse(opt.isPresent());
}
java.util.NoSuchElementException: No value present
at java.util.Optional.get(Optional.java:135)
at org.ruoxue.java_147.optional.OptionalMethodsTest.getThrowException(OptionalMethodsTest.java:90)
isPresent
Optional Methods in Java 建立 Optional 容器,判斷容器內值是否存在。
@Test
public void isPresent() {
Optional<String> opt = Optional.ofNullable("Beef");
boolean result = opt.isPresent();
System.out.println(result);
assertTrue(result);
Optional<Integer> intOpt = Optional.ofNullable(147);
result = intOpt.isPresent();
System.out.println(result);
assertTrue(result);
Optional<List<String>> listOpt = Optional.ofNullable(new ArrayList<>(Arrays.asList("Beef", "Chicken", "Duck")));
result = listOpt.isPresent();
System.out.println(result);
assertTrue(result);
Optional<Object> objOpt = Optional.ofNullable(null);
result = objOpt.isPresent();
System.out.println(result);
assertFalse(result);
}
true
true
true
false
ifPresent
Optional Methods in Java 建立 Optional 容器,當容器內有值存在,才會執行方法。
@Test
public void ifPresent() {
Optional<String> opt = Optional.ofNullable("Beef");
opt.ifPresent(e -> System.out.println(e + ", " + e.length()));
assertTrue(opt.isPresent());
Optional<Integer> intOpt = Optional.ofNullable(147);
intOpt.ifPresent(System.out::println);
assertTrue(intOpt.isPresent());
Optional<List<String>> listOpt = Optional.ofNullable(new ArrayList<>(Arrays.asList("Beef", "Chicken", "Duck")));
listOpt.ifPresent(e -> {
System.out.println(e);
});
assertTrue(listOpt.isPresent());
Optional<Object> objOpt = Optional.ofNullable(null);
objOpt.ifPresent(e -> System.out.println(e));
assertFalse(objOpt.isPresent());
}
Beef, 4
147
[Beef, Chicken, Duck]
OptionalMethodsTest.java
Optional Methods Java 新增單元測試,驗證是否符合預期。
package org.ruoxue.java_147.optional;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.Optional;
import org.junit.Test;
public class OptionalMethodsTest {
@Test
public void empty() {
Optional<String> emptyOpt = Optional.empty();
System.out.println(emptyOpt);
assertFalse(emptyOpt.isPresent());
System.out.println(emptyOpt);
emptyOpt = Optional.ofNullable(null);
assertFalse(emptyOpt.isPresent());
}
@Test
public void of() {
Optional<String> opt = Optional.of("Beef");
System.out.println(opt);
assertTrue(opt.isPresent());
Optional<Integer> intOpt = Optional.of(147);
System.out.println(intOpt);
assertTrue(intOpt.isPresent());
Optional<List<String>> listOpt = Optional.of(new ArrayList<>(Arrays.asList("Beef", "Chicken", "Duck")));
System.out.println(listOpt);
assertTrue(listOpt.isPresent());
}
@Test(expected = NullPointerException.class)
public void ofThrowException() {
Optional<String> opt = Optional.of(null);
assertFalse(opt.isPresent());
}
@Test
public void ofNullable() {
Optional<String> opt = Optional.ofNullable("Beef");
System.out.println(opt);
assertTrue(opt.isPresent());
Optional<Integer> intOpt = Optional.ofNullable(147);
System.out.println(intOpt);
assertTrue(intOpt.isPresent());
Optional<List<String>> listOpt = Optional.ofNullable(new ArrayList<>(Arrays.asList("Beef", "Chicken", "Duck")));
System.out.println(listOpt);
assertTrue(listOpt.isPresent());
Optional<Object> objOpt = Optional.ofNullable(null);
System.out.println(objOpt);
assertFalse(objOpt.isPresent());
}
@Test
public void get() {
Optional<String> opt = Optional.of("Beef");
System.out.println(opt);
String result = opt.get();
System.out.println(result);
assertEquals("Beef", result);
Optional<Integer> intOpt = Optional.of(147);
System.out.println(intOpt);
int intResult = intOpt.get();
System.out.println(intResult);
assertEquals(147, intResult);
Optional<List<String>> listOpt = Optional.of(new ArrayList<>(Arrays.asList("Beef", "Chicken", "Duck")));
System.out.println(listOpt);
List<String> listResult = listOpt.get();
System.out.println(listResult);
assertEquals(3, listResult.size());
}
@Test(expected = NoSuchElementException.class)
public void getThrowException() {
Optional<String> opt = Optional.ofNullable(null);
System.out.println(opt.get());
assertFalse(opt.isPresent());
}
@Test
public void isPresent() {
Optional<String> opt = Optional.ofNullable("Beef");
boolean result = opt.isPresent();
System.out.println(result);
assertTrue(result);
Optional<Integer> intOpt = Optional.ofNullable(147);
result = intOpt.isPresent();
System.out.println(result);
assertTrue(result);
Optional<List<String>> listOpt = Optional.ofNullable(new ArrayList<>(Arrays.asList("Beef", "Chicken", "Duck")));
result = listOpt.isPresent();
System.out.println(result);
assertTrue(result);
Optional<Object> objOpt = Optional.ofNullable(null);
result = objOpt.isPresent();
System.out.println(result);
assertFalse(result);
}
@Test
public void ifPresent() {
Optional<String> opt = Optional.ofNullable("Beef");
opt.ifPresent(e -> System.out.println(e + ", " + e.length()));
assertTrue(opt.isPresent());
Optional<Integer> intOpt = Optional.ofNullable(147);
intOpt.ifPresent(System.out::println);
assertTrue(intOpt.isPresent());
Optional<List<String>> listOpt = Optional.ofNullable(new ArrayList<>(Arrays.asList("Beef", "Chicken", "Duck")));
listOpt.ifPresent(e -> {
System.out.println(e);
});
assertTrue(listOpt.isPresent());
Optional<Object> objOpt = Optional.ofNullable(null);
objOpt.ifPresent(e -> System.out.println(e));
assertFalse(objOpt.isPresent());
}
}
心得分享
Optional Methods in Java 容器物件,只有兩種狀態,有值或無值,目的是做為 null 值的替代方案, Optional Functions in Java 在應用上相當廣泛,熟悉這些方法的操作,如: of 、 get 、 isPresent 、 ifPresent 等,提供了幾種 Optional 常見範例。