Java Predicate Method Reference - Java 147

Java Predicate Method Reference – Java 147

Java Predicate Method Reference

引用其他方法為實例,使用 Lambda 語法,傳入 1 個泛型物件參數,執行完後會回傳 boolean 值,例如引用 String 、 List 、 Map 、 Queue 等, Predicate Method Reference Java 介紹常見的 add 、 offer 、 contains 、 remove 等方法,了解 Predicate 的不同操作和應用,本篇增加了範例,並透過單元測試來驗證產出結果。

@FunctionalInterface
public interface Predicate<T> {
    boolean test(T t);
}

檔案目錄

./
   +- src
       +- test
       |   +- org
       |       +- ruoxue
       |           +- java_147
       |               +- functional
       |                   +- predicate
       |                       +- PredicateReferenceTest.java   

單元測試

Predicate Java Method Reference 提供方法引用、參考等操作 Predicate test Java 。

Objects_nonNull

建立一個 Predicate ,使用 Objects nonNull ,檢查物件是否為 Null。

	@Test
	public void Objects_nonNull() {
		Predicate<String> nonNull = Objects::nonNull;
		boolean result = nonNull.test("Bacon");
		System.out.println(result);
		assertTrue(result);

		result = nonNull.test(null);
		System.out.println(result);
		assertFalse(result);
	}
true
false

String_contains

建立一個 Predicate ,使用 String contains ,檢查包含指定的字元。

	@Test
	public void String_contains() {
		String value = "Bacon";
		Predicate<String> contains = value::contains;
		boolean result = contains.test("o");
		System.out.println(result);
		assertTrue(result);

		value = "Ham";
		contains = value::contains;
		result = contains.test("o");
		System.out.println(result);
		assertFalse(result);
	}
true
false

List_add

Predicate Java Method Reference 建立一個 Predicate ,使用 List add ,增加三個元素。

	@Test
	public void List_add() {
		List<String> list = new ArrayList<String>();
		Predicate<String> add = list::add;
		boolean result = add.test("Bacon");
		System.out.println(result);
		assertTrue(result);
		result = add.test("Ham");
		System.out.println(result);
		assertTrue(result);
		result = add.test("Pork");
		System.out.println(result);
		assertTrue(result);
		System.out.println(list);
	}
true
true
true
[Bacon, Ham, Pork]

List_remove

Predicate Java Method Reference 建立一個 Predicate ,使用 List remove ,內有三個元素,刪除指定元素。

	@Test
	public void List_remove() {
		List<String> list = new ArrayList<String>(Arrays.asList("Bacon", "Ham", "Pork"));
		Predicate<String> remove = list::remove;
		boolean result = remove.test("Bacon");
		System.out.println(result);
		assertTrue(result);
		result = remove.test("Bread");
		System.out.println(result);
		assertFalse(result);
		System.out.println(list);
	}
true
false
[Ham, Pork]

List_contains

Predicate Java Method Reference 建立一個 Predicate ,使用 List contains ,內有三個元素,檢查包含指定的元素。

	@Test
	public void List_contains() {
		List<String> list = Arrays.asList("Bacon", "Ham", "Pork");
		Predicate<String> contains = list::contains;
		boolean result = contains.test("Bacon");
		System.out.println(result);
		assertTrue(result);
		result = contains.test("Bread");
		System.out.println(result);
		assertFalse(result);
	}
true
false

Map_containsKey

Predicate Java Method Reference 建立一個 Predicate ,使用 Map containsKey ,內有三個元素,檢查包含指定的 Key 。

	@Test
	public void Map_containsKey() {
		Map<String, Integer> map = new HashMap<String, Integer>();
		map.put("Bacon", 1);
		map.put("Ham", 2);
		map.put("Pork", 3);

		Predicate<String> containsKey = map::containsKey;
		boolean result = containsKey.test("Bacon");
		System.out.println(result);
		assertTrue(result);
		result = containsKey.test("Bread");
		System.out.println(result);
		assertFalse(result);
	}
true
false

Map_containsValue

Java Predicate test 建立一個 Predicate ,使用 Map containsValue ,內有三個元素,檢查包含指定的 Value 。

	@Test
	public void Map_containsValue() {
		Map<String, Integer> map = new HashMap<String, Integer>();
		map.put("Bacon", 1);
		map.put("Ham", 2);
		map.put("Pork", 3);

		Predicate<Integer> containsValue = map::containsValue;
		boolean result = containsValue.test(1);
		System.out.println(result);
		assertTrue(result);
		result = containsValue.test(9);
		System.out.println(result);
		assertFalse(result);
	}
true
false

Queue_offer

Java Predicate test 建立一個 Predicate ,使用 Queue offer ,增加三個元素。

	@Test
	public void Queue_offer() {
		Queue<String> queue = new ConcurrentLinkedQueue<String>();
		Predicate<String> offer = queue::offer;
		boolean result = offer.test("Bacon");
		System.out.println(result);
		assertTrue(result);
		result = offer.test("Ham");
		System.out.println(result);
		assertTrue(result);

		Predicate<String> queueOfferPredicate = queue::offer;
		result = queueOfferPredicate.test("Pork");
		System.out.println(result);
		assertTrue(result);
		System.out.println(queue);
	}
true
true
true
[Bacon, Ham, Pork]

Queue_remove

Java Predicate test 建立一個 Predicate ,使用 Queue remove ,內有三個元素,刪除指定元素。

	@Test
	public void Queue_remove() {
		Queue<String> queue = new ConcurrentLinkedQueue<String>(Arrays.asList("Bacon", "Ham", "Pork"));
		Predicate<String> remove = queue::remove;
		boolean result = remove.test("Bacon");
		System.out.println(result);
		assertTrue(result);
		result = remove.test("Bread");
		System.out.println(result);
		assertFalse(result);
		System.out.println(queue);
	}
true
false
[Ham, Pork]

Queue_contains

Java Predicate test 建立一個 Predicate ,使用 Queue contains ,內有三個元素,檢查包含指定的元素。

	@Test
	public void Queue_contains() {
		Queue<String> queue = new ConcurrentLinkedQueue<String>(Arrays.asList("Bacon", "Ham", "Pork"));
		Predicate<String> contains = queue::contains;
		boolean result = contains.test("Bacon");
		System.out.println(result);
		assertTrue(result);
		result = contains.test("Bread");
		System.out.println(result);
		assertFalse(result);
	}
true
false

PredicateReferenceTest.java

Java Predicate test 新增單元測試,驗證是否符合預期。

package org.ruoxue.java_147.functional.predicate;

import static org.junit.Assert.*;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.function.Predicate;

import org.junit.Test;

public class PredicateReferenceTest {

	@Test
	public void Objects_nonNull() {
		Predicate<String> nonNull = Objects::nonNull;
		boolean result = nonNull.test("Bacon");
		System.out.println(result);
		assertTrue(result);

		result = nonNull.test(null);
		System.out.println(result);
		assertFalse(result);
	}

	@Test
	public void String_contains() {
		String value = "Bacon";
		Predicate<String> contains = value::contains;
		boolean result = contains.test("o");
		System.out.println(result);
		assertTrue(result);

		value = "Ham";
		contains = value::contains;
		result = contains.test("o");
		System.out.println(result);
		assertFalse(result);
	}

	@Test
	public void List_add() {
		List<String> list = new ArrayList<String>();
		Predicate<String> add = list::add;
		boolean result = add.test("Bacon");
		System.out.println(result);
		assertTrue(result);
		result = add.test("Ham");
		System.out.println(result);
		assertTrue(result);
		result = add.test("Pork");
		System.out.println(result);
		assertTrue(result);
		System.out.println(list);
	}

	@Test
	public void List_remove() {
		List<String> list = new ArrayList<String>(Arrays.asList("Bacon", "Ham", "Pork"));
		Predicate<String> remove = list::remove;
		boolean result = remove.test("Bacon");
		System.out.println(result);
		assertTrue(result);
		result = remove.test("Bread");
		System.out.println(result);
		assertFalse(result);
		System.out.println(list);
	}

	@Test
	public void List_contains() {
		List<String> list = Arrays.asList("Bacon", "Ham", "Pork");
		Predicate<String> contains = list::contains;
		boolean result = contains.test("Bacon");
		System.out.println(result);
		assertTrue(result);
		result = contains.test("Bread");
		System.out.println(result);
		assertFalse(result);
	}

	@Test
	public void Map_containsKey() {
		Map<String, Integer> map = new HashMap<String, Integer>();
		map.put("Bacon", 1);
		map.put("Ham", 2);
		map.put("Pork", 3);

		Predicate<String> containsKey = map::containsKey;
		boolean result = containsKey.test("Bacon");
		System.out.println(result);
		assertTrue(result);
		result = containsKey.test("Bread");
		System.out.println(result);
		assertFalse(result);
	}

	@Test
	public void Map_containsValue() {
		Map<String, Integer> map = new HashMap<String, Integer>();
		map.put("Bacon", 1);
		map.put("Ham", 2);
		map.put("Pork", 3);

		Predicate<Integer> containsValue = map::containsValue;
		boolean result = containsValue.test(1);
		System.out.println(result);
		assertTrue(result);
		result = containsValue.test(9);
		System.out.println(result);
		assertFalse(result);
	}

	@Test
	public void Queue_offer() {
		Queue<String> queue = new ConcurrentLinkedQueue<String>();
		Predicate<String> offer = queue::offer;
		boolean result = offer.test("Bacon");
		System.out.println(result);
		assertTrue(result);
		result = offer.test("Ham");
		System.out.println(result);
		assertTrue(result);

		Predicate<String> queueOfferPredicate = queue::offer;
		result = queueOfferPredicate.test("Pork");
		System.out.println(result);
		assertTrue(result);
		System.out.println(queue);
	}

	@Test
	public void Queue_remove() {
		Queue<String> queue = new ConcurrentLinkedQueue<String>(Arrays.asList("Bacon", "Ham", "Pork"));
		Predicate<String> remove = queue::remove;
		boolean result = remove.test("Bacon");
		System.out.println(result);
		assertTrue(result);
		result = remove.test("Bread");
		System.out.println(result);
		assertFalse(result);
		System.out.println(queue);
	}

	@Test
	public void Queue_contains() {
		Queue<String> queue = new ConcurrentLinkedQueue<String>(Arrays.asList("Bacon", "Ham", "Pork"));
		Predicate<String> contains = queue::contains;
		boolean result = contains.test("Bacon");
		System.out.println(result);
		assertTrue(result);
		result = contains.test("Bread");
		System.out.println(result);
		assertFalse(result);
	}
}

心得分享

Predicate test Java 除了傳統實作接口的方法,使用 Lambda 表達式實作功能,能讓程式碼更加簡潔與直接,大幅提高可讀性, Java Predicate test 提供了幾種 Predicate 常見方法的操作範例。

發佈留言