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 函数接口