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