Table of Contents
ToggleJava 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 常見方法的操作範例。