Java Optional Methods - Java 147

Java Optional Methods – Java 147

Java 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 常見範例。

發佈留言