Java 8 Consumer 函数接口

这篇文章属于 Java 8 教程(LTS)系列教程,点击阅读更多相关文章。

Java 中的 Consumer 是一个函数式接口,它可以接受一个泛型 <T> 类型参数,进行处理后无任何返回值。例如传入一个字符串,打印一个字符串。

源码:Consumer 在 Java 8 中的实现。

import java.util.Objects;

@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. Consumer accept

accept() 方法即是 Consumer 函数式接口的函数方法,传入一个任意类型,无返回值,可以用于 Lambda 表达式和方法引用。

示例:输出字符串的长度,输出字符串本身。

import java.util.function.Consumer;

public class Java8Consumer {

    public static void main(String[] args) {
        Consumer<String> lengthConsumer = s -> System.out.println(s.length());
        lengthConsumer.accept("www.wdbyte.com");
        
        Consumer<String> printConsumer = System.out::println;
        printConsumer.accept("www.wdbyte.com");
    }
}

输出结果:

14
www.wdbyte.com

2. Consumer andThen

andThen() 方法可以传入一个 Consumer,返回组合了两个 Consumer 后的 Consumer ,传入的 Consumer 不能为 null,否则会得到 NullPointerException

示例:先输出字符串的长度,再输出字符串本身。

import java.util.function.Consumer;

public class Java8ConsumerAndThen {

    public static void main(String[] args) {
        Consumer<String> lengthConsumer = s -> System.out.println(s.length());
        Consumer<String> printConsumer = lengthConsumer.andThen(System.out::println);
        printConsumer.accept("www.wdbyte.com");
    }
}

输出结果:

14
www.wdbyte.com

3. Consumer forEach

集合中的 forEach 是通过 Consumer 实现的。

示例:实现一个 forEach 方法,输出 List 中的字符串,输出 List 中的字符串长度。

import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;

public class Java8ConsumerForEach {

    public static void main(String[] args) {
        Consumer<String> printConsumer = System.out::println;
        List<String> list = Arrays.asList("java", "node", "www.wdbyte.com");
      
        forEach(list, printConsumer);
        forEach(list, s -> System.out.println(s.length()));
    }

    public static <T> void forEach(List<T> list, Consumer<T> consumer) {
        for (T t : list) {
            consumer.accept(t);
        }
    }
}

输出结果:

java
node
www.wdbyte.com
4
4
14

4. Consumer 扩展

除了 Consumer 之外,Java 8 还提供了适用于不同类型的 Consumer。

函数接口 描述
BiConsumer 传入两个任意类型参数,无返回值
DoubleConsumer 传入一个 double 参数,无返回值
IntConsumer 传入一个 int 参数,无返回值
LongConsumer 传入一个 long 参数,无返回值
ObjDoubleConsumer 传入一个任意类型参数,一个 double 参数,无返回值
ObjIntConsumer 传入一个任意类型参数,一个 int 参数,无返回值
ObjLongConsumer 传入一个任意类型参数,一个 long 参数,无返回值

示例:使用 ObjIntConsumer 输出集合中字符串长度为 4 的字符串。

public class Java8ObjIntConsumer {

    public static void main(String[] args) {
        List<String> list = Arrays.asList("java", "node", "www.wdbyte.com");
        ObjIntConsumer<String> consumer = (str, i) -> {
            if (str.length() == i) {
                System.out.println(str);
            }
        };
        forEach(list, consumer, 4);
    }

    public static <T> void forEach(List<T> list, ObjIntConsumer<T> consumer, int i) {
        for (T t : list) {
            consumer.accept(t, i);
        }
    }
}

输出结果:

java
node

参考

扩展阅读:Java 8 Function 函数接口