Java8函数式接口Consumer使用教程

作者 | 2020年4月23日

在Java8中,Consumer是一个函数式接口,它只接受一个参数,没有返回值。

Consumer.java

@FunctionalInterface
public interface Consumer<T{
  void accept(T t);
}

实例1:基本用法

下面的程序会把变量x打印到屏幕上:

Java8Consumer1.java

package cc.myexample.java8;

import java.util.function.Consumer;

public class Java8Consumer1 {

    public static void main(String[] args) {

        Consumer<String> print = x -> System.out.println(x);
        print.accept("java");   // java

    }

}

输出

java

实例2:模拟forEach

Java8Consumer2.java

package cc.myexample.java8;

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

public class Java8Consumer2 {

    public static void main(String[] args) {

        List<Integer> list = Arrays.asList(12345);

        // 通过变量的方式传递
        Consumer<Integer> consumer = (Integer x) -> System.out.println(x);
        forEach(list, consumer);

        // 或通过lambda的方式传递
        forEach(list, (Integer x) -> System.out.println(x));

    }

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

}

输出

1
2
3
4
5
1
2
3
4
5

我们对上面的程序进行一些改动,让它打印字符串的长度:

Java8Consumer3.java

package cc.myexample.java8;

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

public class Java8Consumer3 {

    public static void main(String[] args) {

        List<String> list = Arrays.asList("a""ab""abc");
        forEach(list, (String x) -> System.out.println(x.length()));

    }

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

}

输出

1
2
3

发表评论

电子邮件地址不会被公开。 必填项已用*标注