Java中的BiConsumer
介绍
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的接口,但它只接受一个参数
package cn.caigen.biconsumertutorial;
import java.util.function.BiConsumer;
public class BiConsumerEx1 {
public static void main(String[] args) {
BiConsumer<String, String> greeter = (firstname, lastname)-> System.out.println("Hello " + firstname + " " + lastname);
greeter.accept("James", "Smith");
}
}
Biconsumer方法实现
当一个方法只接受两个参数而且不返回任何东西时,那么可以考虑使用Biconsumer来实现
package cn.caigen.biconsumertutorial;
import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;
public class BiConsumerEx3 {
public static void main(String[] args) {
BiConsumer<String, String> printer = BiConsumerEx3::printContactInfo;
Map<String, String> contacts = new HashMap<>();
contacts.put("John", "12345");
contacts.put("Bill", "34567");
contacts.put("Jack", "22563");
contacts.forEach(printer);
}
public static void printContactInfo(String name, String phoneNumber) {
System.out.println(name + "--" + phoneNumber);
}
}
非静态方法使用
package cn.caigen.biconsumertutorial;
import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;
public class BiConsumerEx4 {
public static void main(String[] args) {
Map<String, String> contacts = new HashMap<>();
contacts.put("John", "123456");
contacts.put("Bill", "22345");
contacts.put("caigen", "33567");
CardTemplate template = new CardTemplate("designed by Bill");
BiConsumer<String, String> bc = template::printCard;
contacts.forEach(bc);
}
}
class CardTemplate {
private String someInfo;
public CardTemplate(String someInfo){
this.someInfo = someInfo;
}
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();
}
}
addThen(BiConsumer after)
addThen()方法返回一个关联的BiConsumer,首先,当前BiConsumer被调用,然后after将被调用next,如果在上述两个步骤之一中发生错误,则将错误,传递给调用者。如果当前BiConsumer出现错误则after会被忽略。
// default 修饰符只能用在接口的属性或者方法中并且被修饰的方法必须有实现
default BiConsumer<T, U> andThen(BiConsumer<? super T, ? super U> after) {
Objects.requireNonNull(after);
return (l, r) -> {
accept(l, r);
after.accept(l, r);
};
}
package cn.caigen.biconsumertutorial;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.function.Predicate;
public class BiConsumer_addthen_Ex1 {
public static void main(String[] args) {
Map<String, Integer> contacts = new HashMap<>();
Predicate<Integer> predicate = i -> i % 2 == 1;
contacts.put("John", 123456);
contacts.put("Bill", 12580);
contacts.put("Lisa", 16979);
BiConsumer<String, Integer> biConsumer1 =
(name, phone) -> System.out.println("Name: " + name + " Number: " + phone);
BiConsumer<String, Integer> biConsumer2 =
(name, phone) -> System.out.println("Name: "+ name.toUpperCase() + " Number: " + phone);
contacts.forEach(biConsumer1.andThen(biConsumer2));
}
}
map to map
package cn.caigen.biconsumertutorial;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
public class BiConsumer_map2map {
public static void main(String[] args) {
Map<String, Integer> empSalaryMap = new HashMap<>();
empSalaryMap.put("E01", 100);
empSalaryMap.put("E02", 200);
empSalaryMap.put("E03", 300);
Map<String, Integer> newEmpSalaryMap = empSalaryMap.entrySet()
.stream()
.collect(Collectors.toMap(stringIntegerEntry -> stringIntegerEntry.getKey(), stringIntegerEntry -> 2* stringIntegerEntry.getValue()));
System.out.println("Origin map: " + empSalaryMap);
System.out.println();
System.out.println("New Map: " + newEmpSalaryMap);
}
}