Table of Contents
ToggleJava BiConsumer Method Reference
引用其他方法為實例,使用 Lambda 語法,傳入 2 個泛型物件參數,無傳回值,例如引用 StringBuilder 、 List 、 Map 、 Queue 等, BiConsumer Method Reference Java 介紹常見的 append 、 add 、 offer 、 remove 等方法,了解 BiConsumer 的不同操作和應用,本篇增加了範例,並透過單元測試來驗證產出結果。
@FunctionalInterface
public interface BiConsumer<T, U> {
void accept(T t, U u);
}
檔案目錄
./
+- src
+- test
| +- org
| +- ruoxue
| +- java_147
| +- functional
| +- biconsumer
| +- BiConsumerReferenceTest.java
單元測試
BiConsumer Java Method Reference 提供方法引用、參考等操作 BiConsumer accept Java 。
StringBuilder_append
建立一個 BiConsumer ,使用 StringBuilder append ,新增字串。
@Test
public void StringBuilder_append() {
StringBuilder value = new StringBuilder();
BiConsumer<StringBuilder, String> append = StringBuilder::append;
append.accept(value, "Bacon, ");
append.accept(value, "Ham, ");
append.accept(value, "Pork");
System.out.println(value);
}
Bacon, Ham, Pork
List_add
BiConsumer Java Method Reference 建立一個 BiConsumer ,使用 List add ,增加三個元素。
@Test
public void List_add() {
int expectedSize = 3;
List<String> list = new ArrayList<String>();
BiConsumer<List<String>, String> add = List::add;
add.accept(list, "Bacon");
add.accept(list, "Ham");
add.accept(list, "Pork");
System.out.println(list);
assertEquals(expectedSize, list.size());
}
[Bacon, Ham, Pork]
List_remove
BiConsumer Java Method Reference 建立一個 BiConsumer ,使用 List remove ,內有三個元素,刪除指定元素。
@Test
public void List_remove() {
int expectedSize = 2;
List<String> list = new ArrayList<String>(Arrays.asList("Bacon", "Ham", "Pork"));
BiConsumer<List<String>, String> remove = List::remove;
remove.accept(list, "Bacon");
remove.accept(list, "Bread");
System.out.println(list);
assertEquals(expectedSize, list.size());
}
[Ham, Pork]
Map_remove
BiConsumer Java Method Reference 建立一個 BiConsumer ,使用 Map remove ,內有三個元素,刪除指定元素。
@Test
public void Map_remove() {
int expectedSize = 2;
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("Bacon", 1);
map.put("Ham", 2);
map.put("Pork", 3);
BiConsumer<Map<String, Integer>, String> remove = Map::remove;
remove.accept(map, "Bacon");
remove.accept(map, "Bread");
System.out.println(map);
assertEquals(expectedSize, map.size());
}
{Ham=2, Pork=3}
Queue_offer
Java BiConsumer accept 建立一個 BiConsumer ,使用 Queue offer ,增加三個元素。
@Test
public void Queue_offer() {
int expectedSize = 3;
Queue<String> queue = new ConcurrentLinkedQueue<String>();
BiConsumer<Queue<String>, String> offer = Queue::offer;
offer.accept(queue, "Bacon");
offer.accept(queue, "Ham");
Consumer<String> queueOfferConsumer = queue::offer;
queueOfferConsumer.accept("Pork");
System.out.println(queue);
assertEquals(expectedSize, queue.size());
}
[Bacon, Ham, Pork]
Queue_remove
Java BiConsumer accept 建立一個 BiConsumer ,使用 Queue remove ,內有三個元素,刪除指定元素。
@Test
public void Queue_remove() {
int expectedSize = 2;
Queue<String> queue = new ConcurrentLinkedQueue<String>(Arrays.asList("Bacon", "Ham", "Pork"));
BiConsumer<Queue<String>, String> remove = Queue::remove;
remove.accept(queue, "Bacon");
remove.accept(queue, "Bread");
System.out.println(queue);
assertEquals(expectedSize, queue.size());
}
true
false
[Ham, Pork]
Queue_contains
Java BiPredicate test 建立一個 BiPredicate ,使用 Queue contains ,內有三個元素,檢查包含指定的元素。
@Test
public void Queue_contains() {
Queue<String> queue = new ConcurrentLinkedQueue<String>(Arrays.asList("Bacon", "Ham", "Pork"));
BiPredicate<Queue<String>, String> contains = Queue::contains;
boolean result = contains.test(queue, "Bacon");
System.out.println(result);
assertTrue(result);
result = contains.test(queue, "Bread");
System.out.println(result);
assertFalse(result);
}
[Ham, Pork]
BiConsumerReferenceTest.java
Java BiConsumer accept 新增單元測試,驗證是否符合預期。
package org.ruoxue.java_147.functional.biconsumer;
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.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import org.junit.Test;
public class BiConsumerReferenceTest {
@Test
public void StringBuilder_append() {
StringBuilder value = new StringBuilder();
BiConsumer<StringBuilder, String> append = StringBuilder::append;
append.accept(value, "Bacon, ");
append.accept(value, "Ham, ");
append.accept(value, "Pork");
System.out.println(value);
}
@Test
public void List_add() {
int expectedSize = 3;
List<String> list = new ArrayList<String>();
BiConsumer<List<String>, String> add = List::add;
add.accept(list, "Bacon");
add.accept(list, "Ham");
add.accept(list, "Pork");
System.out.println(list);
assertEquals(expectedSize, list.size());
}
@Test
public void List_remove() {
int expectedSize = 2;
List<String> list = new ArrayList<String>(Arrays.asList("Bacon", "Ham", "Pork"));
BiConsumer<List<String>, String> remove = List::remove;
remove.accept(list, "Bacon");
remove.accept(list, "Bread");
System.out.println(list);
assertEquals(expectedSize, list.size());
}
@Test
public void Map_remove() {
int expectedSize = 2;
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("Bacon", 1);
map.put("Ham", 2);
map.put("Pork", 3);
BiConsumer<Map<String, Integer>, String> remove = Map::remove;
remove.accept(map, "Bacon");
remove.accept(map, "Bread");
System.out.println(map);
assertEquals(expectedSize, map.size());
}
@Test
public void Queue_offer() {
int expectedSize = 3;
Queue<String> queue = new ConcurrentLinkedQueue<String>();
BiConsumer<Queue<String>, String> offer = Queue::offer;
offer.accept(queue, "Bacon");
offer.accept(queue, "Ham");
Consumer<String> queueOfferConsumer = queue::offer;
queueOfferConsumer.accept("Pork");
System.out.println(queue);
assertEquals(expectedSize, queue.size());
}
@Test
public void Queue_remove() {
int expectedSize = 2;
Queue<String> queue = new ConcurrentLinkedQueue<String>(Arrays.asList("Bacon", "Ham", "Pork"));
BiConsumer<Queue<String>, String> remove = Queue::remove;
remove.accept(queue, "Bacon");
remove.accept(queue, "Bread");
System.out.println(queue);
assertEquals(expectedSize, queue.size());
}
}
心得分享
BiConsumer accept Java 除了傳統實作接口的方法,使用 Lambda 表達式實作功能,能讓程式碼更加簡潔與直接,大幅提高可讀性, Java BiConsumer accept 提供了幾種 BiConsumer 常見方法的操作範例。