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);
    }
}

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BiConsumer是一个函数式接口,它接受两个输入参数并不返回任何结果。下面是一个使用Java 8的BiConsumer的简单示例: 假设我们有一个名为Person的类,它具有两个属性:name和age。我们想要在控制台上打印出每个人的姓名和年龄。我们可以使用BiConsumer接口来实现这个功能,如下所示: ```java import java.util.function.BiConsumer; public class BiConsumerExample { public static void main(String[] args) { BiConsumer<Person, String> printName = (person, prefix) -> System.out.println(prefix + " " + person.getName()); BiConsumer<Person, Integer> printAge = (person, prefix) -> System.out.println(prefix + " " + person.getAge()); Person person1 = new Person("Alice", 25); Person person2 = new Person("Bob", 30); printName.andThen(printAge).accept(person1, "Person 1:"); printName.andThen(printAge).accept(person2, "Person 2:"); } } class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } } ``` 在上面的示例,我们定义了两个BiConsumer实例:printName和printAge。printName将接受Person对象和一个前缀字符串,并打印出该人的姓名,printAge将接受Person对象和一个前缀字符串,并打印出该人的年龄。 我们创建了两个Person对象,person1和person2,然后使用andThen方法将两个BiConsumer实例链接起来,这样我们就可以一次性打印出每个人的姓名和年龄。最后,我们调用accept方法,将每个Person对象和前缀字符串传递给BiConsumer实例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值