今天将介绍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