Руководство Java BiConsumer
1. BiConsumer
В Java 8, BiConsumer - это functional interface, представляющий оператор, который принимает два входных параметра и ничего не возвращает.
BiConsumer
@FunctionalInterface
public interface BiConsumer<T, U> {
void accept(T t, U u);
default BiConsumer<T, U> andThen(BiConsumer<? super T, ? super U> after);
}
См. Подробнее: Consumer - это интерфейс, похожий на BiConsumer, но он принимает только один параметр:
Например:
BiConsumerEx1.java
package org.o7planning.biconsumer.ex;
import java.util.function.BiConsumer;
public class BiConsumerEx1 {
public static void main(String[] args) {
// Create a BiConsumer object directly
BiConsumer<String, String> greeter
= (firstName, lastName) -> System.out.println("Hello " + firstName+ " " + lastName);
greeter.accept("James", "Smith");
}
}
Output:
Hello James Smith
Ниже приведен список методов в пакете java.util, использующих BiConsumer:
Modifier and Type | Method and Description |
void | IdentityHashMap.forEach(BiConsumer<? super K,? super V> action) |
void | TreeMap.forEach(BiConsumer<? super K,? super V> action) |
void | LinkedHashMap.forEach(BiConsumer<? super K,? super V> action) |
void | Hashtable.forEach(BiConsumer<? super K,? super V> action) |
void | HashMap.forEach(BiConsumer<? super K,? super V> action) |
void | WeakHashMap.forEach(BiConsumer<? super K,? super V> action) |
default void | Map.forEach(BiConsumer<? super K,? super V> action) |
Например: Использование метода Map.forEach(BiConsumer):
BiConsumerEx2.java
package org.o7planning.biconsumer.ex;
import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;
public class BiConsumerEx2 {
public static void main(String[] args) {
BiConsumer<String, String> printer
= (phoneNumber, fullName) -> System.out.println(phoneNumber + " - " + fullName);
Map<String, String> contacts = new HashMap<String,String>();
contacts.put("1111 2222", "James Smith");
contacts.put("1111 3333", "Michael Smith");
contacts.put("1233 5555", "David Garcia");
contacts.forEach(printer);
}
}
Output:
1233 5555 - David Garcia
1111 2222 - James Smith
1111 3333 - Michael Smith
2. BiConsumer + Method reference
Если статический метод принимает два параметра и ничего не возвращает, то его ссылка может рассматриваться как BiConsumer.
Например:
BiConsumer_mRef_ex1.java
package org.o7planning.biconsumer.ex;
import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;
public class BiConsumer_mRef_ex1 {
public static void main(String[] args) {
Map<String, String> contacts = new HashMap<String,String>();
contacts.put("1111 2222", "James Smith");
contacts.put("1111 3333", "Michael Smith");
contacts.put("1233 5555", "David Garcia");
// Static method reference:
BiConsumer<String, String> bc = MyUtils::printContactInfo;
contacts.forEach(bc);
}
}
class MyUtils {
// Static method:
public static void printContactInfo(String phone, String name) {
System.out.println("Phone: " + phone + " / Full Name: " + name);
}
}
Output:
Phone: 1233 5555 / Full Name: David Garcia
Phone: 1111 2222 / Full Name: James Smith
Phone: 1111 3333 / Full Name: Michael Smith
Example: BiConsumer + Non-static method reference:
BiConsumer_mRef_ex2.java
package org.o7planning.biconsumer.ex;
import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;
public class BiConsumer_mRef_ex2 {
public static void main(String[] args) {
Map<String, String> contacts = new HashMap<String,String>();
contacts.put("1111 2222", "James Smith");
contacts.put("1111 3333", "Michael Smith");
contacts.put("1233 5555", "David Garcia");
CardTemplate template = new CardTemplate("Designed by Tom");
// Non-static method reference:
BiConsumer<String, String> bc = template::printCard;
contacts.forEach(bc);
}
}
class CardTemplate {
private String someInfo;
public CardTemplate(String someInfo) {
this.someInfo = someInfo;
}
// Non-static Method:
public void printCard(String phone, String name) {
System.out.println("--- ~~~ ---");
System.out.println("Full Name: " + name);
System.out.println("Phone: " + phone);
System.out.println(someInfo);
System.out.println();
}
}
Output:
--- ~~~ ---
Full Name: David Garcia
Phone: 1233 5555
Designed by Tom
--- ~~~ ---
Full Name: James Smith
Phone: 1111 2222
Designed by Tom
--- ~~~ ---
Full Name: Michael Smith
Phone: 1111 3333
Designed by Tom
3. andThen(BiConsumer after)
Метод andThen(after) возвращает ассоциированный BiConsumer. Сначала вызывается текущий BiConsumer, а затем будет вызван after. Если на одном из двух вышеперечисленных шагов возникает ошибка, она передается вызывающему (caller). Если в текущемBiConsumer возникает ошибка, то after игнорируется.
andThen method
default BiConsumer<T, U> andThen(BiConsumer<? super T, ? super U> after) {
Objects.requireNonNull(after);
return (l, r) -> {
accept(l, r);
after.accept(l, r);
};
}
Например:
BiConsumer_andThen_ex1.java
package org.o7planning.biconsumer.ex;
import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;
public class BiConsumer_andThen_ex1 {
public static void main(String[] args) {
Map<String, String> contacts = new HashMap<String,String>();
contacts.put("1111 2222", "James Smith");
contacts.put("1111 3333", "Michael Smith");
contacts.put("1233 5555", "David Garcia");
BiConsumer<String, String> printer1
= (phoneNumber, fullName) -> System.out.println(phoneNumber + " - " + fullName);
BiConsumer<String, String> printer2
= (phoneNumber, fullName) -> System.out.println(phoneNumber + " - " + fullName.toUpperCase());
contacts.forEach(printer1.andThen(printer2));
}
}
Output:
1233 5555 - David Garcia
1233 5555 - DAVID GARCIA
1111 2222 - James Smith
1111 2222 - JAMES SMITH
1111 3333 - Michael Smith
1111 3333 - MICHAEL SMITH
4. Example: Map to Map
Например: Объект Map<String,Integer> содержит сопоставления между номером сотрудника (employee number) и зарплатой. Создаем аналогичный объект Map<String,Integer> с двойной зарплатой.
BiConsumer_m2m_ex1.java
package org.o7planning.biconsumer.ex;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
public class BiConsumer_m2m_ex1 {
public static void main(String[] args) {
// String employeeNumber --> Integer salary.
Map<String, Integer> empSalaryMap = new HashMap<String, Integer>();
empSalaryMap.put("E01", 1000);
empSalaryMap.put("E02", 1500);
empSalaryMap.put("E03", 3000);
Map<String, Integer> newEmpSalaryMap //
= empSalaryMap.entrySet() // Set<Map.Entry<String,Integer>>
.stream() // // Stream<Map.Entry<String,Integer>>
// Call method:
// collect(Supplier<R>, BiConsumer<R, ? extends Map.Entry<String,Integer>>)
.collect(Collectors.toMap(entry -> entry.getKey(), entry -> 2 * entry.getValue()));
System.out.println("Origin Map: " + empSalaryMap);
System.out.println();
System.out.println("New Map: " + newEmpSalaryMap);
}
}
Output:
Origin Map: {E02=1500, E01=1000, E03=3000}
New Map: {E02=3000, E01=2000, E03=6000}
В принципе, вы можете обработать один объект Map<K,V>, чтобы сформировать другой объект Map<K2,V2>. См. Дополнительные статьи ниже:
- Руководство Java Stream.collect method
Java Basic
- Настройте java compiler для обработки вашего Annotation (Annotation Processing Tool)
- Программирование на Java для группы с помощью Eclipse и SVN
- Руководство Java WeakReference
- Руководство Java PhantomReference
- Сжатие и декомпрессия в Java
- Настройка Eclipse для использования JDK вместо JRE
- Методы String.format() и printf() в Java
- Синтаксис и новые функции в Java 8
- Регулярные выражения Java
- Руководство Java Multithreading Programming
- Библиотеки Java JDBC Driver для различных типов баз данных
- Руководство Java JDBC
- Получить значения столбцов, автоматически возрастающих при вставлении (Insert) записи, используя JDBC
- Руководство Java Stream
- Руководство Java Functional Interface
- Введение в Raspberry Pi
- Руководство Java Predicate
- Абстрактный класс и Interface в Java
- Модификатор доступа (Access modifiers) в Java
- Руководство Java Enum
- Руководство Java Annotation
- Сравнение и Сортировка в Java
- Руководство Java String, StringBuffer и StringBuilder
- Обработка исключений Java - Java Exception Handling
- Руководство Java Generics
- Манипулирование файлами и каталогами в Java
- Руководство Java BiPredicate
- Руководство Java Consumer
- Руководство Java BiConsumer
- Что мне нужно для начала работы с Java?
- История Java и разница между Oracle JDK и OpenJDK
- Установить Java в Windows
- Установите Java в Ubuntu
- Установите OpenJDK в Ubuntu
- Установить Eclipse
- Установите Eclipse в Ubuntu
- Быстрое изучение Java для начинающих
- История бит и байтов в информатике
- Типы данных в java
- Битовые операции
- Команда if else в Java
- команды switch в Java
- Циклы в Java
- Массивы (Array) в Java
- JDK Javadoc в формате CHM
- Наследование и полиморфизм в Java
- Руководство Java Function
- Руководство Java BiFunction
- Пример Java encoding и decoding с использованием Apache Base64
- Руководство Java Reflection
- Java Удаленный вызов методов - Java RMI
- Руководство Программирование Java Socket
- Какую платформу я должен выбрать для разработки приложений Java Desktop?
- Руководство Java Commons IO
- Руководство Java Commons Email
- Руководство Java Commons Logging
- Понимание Java System.identityHashCode, Object.hashCode и Object.equals
- Руководство Java SoftReference
- Руководство Java Supplier
- Аспектно-ориентированное программирование Java с помощью AspectJ (AOP)
Show More
- Руководства Java Servlet/JSP
- Руководства Java Collections Framework
- Java API для HTML, XML
- Руководства Java IO
- Руководства Java Date Time
- Руководства Spring Boot
- Руководства Maven
- Руководства Gradle
- Руководства Java Web Services
- Руководства Java SWT
- Руководства JavaFX
- Руководства Oracle Java ADF
- Руководства Struts2 Framework
- Руководства Spring Cloud