Java8 教程

Java8 内置函数式接口 Consumer

Java8 提供了四种原生函数式接口,分别是 Consumer(消费型) 、 Supplier(供给型) 、 Predicate(断言型) 、Function(功能型),本章节将先来聊一聊 Consumer 接口。

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),有参数,没有返回值。

Consumer 示例

(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
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号