【睡JDK】Java函数式编程接口详解之Consumer、Function

今天将介绍Java另外两个函数编程接口Consumer、Function,这两个函数是干嘛的呢?先看看官方的定义:

  • Consumer:表示接受单个输入参数但不返回结果的操作。
  • Function:表示接受一个参数并生成结果的函数。

一、Consumer

1.1 源代码

@FunctionalInterface
public interface Consumer<T> {
   
    void accept(T t);

    default Consumer<T> andThen(Consumer<? super T> after) {
   
        Objects.requireNonNull(after);
        return (T t) -> {
    accept(t); after.accept(t); };
    }
}

1.2 混脸熟

其实Consumer我们经常使用,你看下面这个例子:

List<String> list = Arrays.asList("1", "2", "3");
list.forEach(System.out::println);

我们经常使用的forEach函数其实就是通过Consumer来实现的,所以掌握Consumer很有必要哦,下面看看forEach在ArrayList中的实现:

public void forEach(Consumer<? super E> action) {
   
    Objects.requireNonNull(action);
    final int expectedModCount = modCount;
    
    final E[] elementData = (E[]) this.elementData;
    final int size = this.size;
    for (int i=0; modCount == expectedModCount && i < size; i++) {
   
        action.accept(elementData[i]);
    }
    if (modCount != expectedModCount) {
   
        throw new ConcurrentModificationException();
    }
}

不用介绍,想必大家也能看的懂,Consumer就表示一个自定义的操作,将该操作作为参数传入到另一个函数内,可在该函数内执行自定义的操作。上面的for循环代码就等同于:

for (int i=0; modCount == expectedModCount && i < size; i++) {
   
    System.out.println(elementData[i]);
}

1.3 实现

如果操作比较常用或者通用,可以使用一个类去实现Consumer,保存该操作,在必要的时候能快速使用。

// 实体类
public class Person {
   
    private String name;
    private Integer age;

    public Person(String name, Integer age) {
   
        this.name = name;
        this.age = age;
    }
    //...
}
// 打印小孩
public class PrintChild implements Consumer<Person> {
   
    @Override
    public void accept(Person person
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值