Java8 提供了四种原生函数式接口,分别是 Consumer(消费型) 、 Supplier(供给型) 、 Predicate(断言型) 、Function(功能型),本章节将先来聊一聊 Consumer 接口。
顾名思义,Consumer(消费者,顾客,用户;食用者,使用者,消耗者)是个消费型的接口,可以实现对数据的消费。我们先看看接口定义:
package java.util.function;
import java.util.Objects;
@FunctionalInterface
public interface Consumer<T> {
/**
* 对给定参数执行此操作。
*
* @param t 输入参数
*/
void accept(T t);
/**
* 返回一个由 Consumer 组成的组件,该组件依次执行此操作和 after 操作。
* 如果执行任一操作时出现异常,则会将异常转发给组合操作的调用者。
* 如果执行此操作时出现异常,则不会执行 after 操作。
*
* @param after 在此操作之后要执行的操作
* @return 组成的 Consumer,依次执行此操作,然后是 after 操作
* @throws NullPointerException 如果 after 是 null
*/
default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t); };
}
}上述代码中,Consumer<T> 函数式接口提供的抽象方法为 void accept(T t),有参数,没有返回值。
(1)该示例仅仅将 access() 方法的参数转为大写,然后输出到控制台。分别通过匿名类和 Lambda 表达式实现:
a、匿名类实现
package com.hxstrive.jdk8.function_interface;
import java.util.function.Consumer;
/**
* Consumer<T> 函数式接口用法
* @author hxstrive.com
*/
public class ConsumerDemo {
public static void main(String[] args) {
Consumer<String> consumer = new Consumer<String>() {
@Override
public void accept(String str) {
// 消费数据
System.out.println(str.toUpperCase());
}
};
consumer.accept("hello world");
consumer.accept("administrator");
}
}b、Lambda 表达式实现
package com.hxstrive.jdk8.function_interface;
import java.util.function.Consumer;
/**
* Consumer<T> 函数式接口用法
* @author hxstrive.com
*/
public class ConsumerDemo2 {
public static void main(String[] args) {
Consumer<String> consumer = str -> {
// 消费数据
System.out.println(str.toUpperCase());
};
consumer.accept("hello world");
consumer.accept("administrator");
}
}输出如下:
HELLO WORLD ADMINISTRATOR
(2)该实例将三个 Consumer 通过 andThen 方法串联起来,当我们调用 accpet 方法时,会自动调用其他 Consumer 的 accpet 方法,如下:
package com.hxstrive.jdk8.function_interface;
import java.util.function.Consumer;
/**
* Consumer<T> 函数式接口用法
* @author hxstrive.com
*/
public class ConsumerDemo3 {
public static void main(String[] args) {
Consumer<String> consumer = createConsumer();
consumer.accept("administrator");
}
private static Consumer<String> createConsumer() {
// 第一个 Consumer
Consumer<String> consumer = e -> {
System.out.println("[1]" + e);
};
// 第二个 Consumer
consumer = consumer.andThen(e -> {
System.out.println("[2]" + e);
});
// 第三个 Consumer
consumer = consumer.andThen(e -> {
System.out.println("[3]" + e);
});
return consumer;
}
}输出如下:
[1]administrator [2]administrator [3]administrator