Consumer是一个消费队列接口,代表了接受一个输入参数并且无返回的操作,是JDK 1.8 新增加的函数接口。
@FunctionalInterface
public interface Consumer<T> {
/**
* 将此函数应用于给定参数
* 真正执行函数接口的方法
*/
void accept(T t);
/**
* 消费链,根函数执行后,执行after函数,参数不变
*/
default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t); };
}
}
这个接口,接收一个泛型的参数T,然后调用accept。
Consumer<Integer> consumer = x -> {
int a = x + 2;
System.out.println(a);// 12
};
consumer.accept(10);
为什么说是消费队列接口呢?
看例子:
Consumer<Integer> consumer1 = x -> {
int a = x + 2;
System.out.println(a);// 12
};
Consumer<Integer> consumer2 = x -> {
int a = x + 3;
System.out.println(a);// 13
};
Consumer<Integer> consumer3 = x -> {
int a = x + 4;
System.out.println(a);// 14
};
consumer1.andThen(consumer2).andThen(consumer3).accept(10);
// 12
// 13
// 14
上面的例子,10按顺序被三个消费者消费了。
Consumer另一个作用,当做回调函数使用。
public class ConsumerDemo {
public void handle(Integer x,Consumer<Integer> consumer){
consumer.accept(x++);//回调
}
public static void main(String[] args) {
ConsumerDemo demo = new ConsumerDemo();
int b = 1;
demo.handle(10, x -> {
int a = x + b + 2;
System.out.println(a);// 13
});
}
}
BiConsumer 与 Consumer是一样的使用方式,区别是Consumer只能有一个参数,BiConsumer可以有两个。
了解了Consumer,BiConsumer ,其他的也就一目了然了:
DoubleConsumer:代表一个接受double值参数的操作,并且不返回结果。
IntConsumer:接受一个int类型的输入参数,无返回值 。
LongConsumer:接受一个long类型的输入参数,无返回值。
ObjDoubleConsumer<T>:接受一个object类型和一个double类型的输入参数,无返回值。
ObjIntConsumer<T>:接受一个object类型和一个int类型的输入参数,无返回值。
ObjLongConsumer<T>:接受一个object类型和一个long类型的输入参数,无返回值。