1.Consumer学习

    Function包中Consumer的使用:
    java.util.function中 Function, Supplier, Consumer, Predicate和其他函数式接口广泛用在支持lambda表达式的API中。这些接口有一个抽象方法,会被lambda表达式的定义所覆盖。
    Consumer的作用顾名思义,是给定义一个参数,对其进行(消费)处理,处理的方式可以是任意操作.

    1. @FunctionalInterface
    2. public interface Consumer<T> {
    3. void accept(T t);
    4. default Consumer<T> andThen(Consumer<? super T> after) {
    5. Objects.requireNonNull(after);
    6. return (T t) -> { accept(t); after.accept(t); };
    7. }
    8. }

    其核心方法如下:

    • void accept(T t);
      对给定的参数T执行定义的操作
    • default Consumer andThen(Consumer<? super T> after)
      对给定的参数T执行定义的操作执行再继续执行after定义的操作

    下面对上述方法进行实例测试:
    比如将给定的一批用户里面的名称为”lisi”且年龄大于22岁的用户都给打包起来

    1. List<Person> lisiList = new ArrayList<>();
    2. Consumer <Person> consumer = x -> {
    3. if (x.name.equals("lisi")){
    4. lisiList.add(x);
    5. }
    6. };
    7. consumer = consumer.andThen(
    8. x -> lisiList.removeIf(y -> y.age < 23)
    9. );
    10. Stream.of(
    11. new Person(21,"zhangsan"),
    12. new Person(22,"lisi"),
    13. new Person(23,"wangwu"),
    14. new Person(24,"wangwu"),
    15. new Person(23,"lisi"),
    16. new Person(26,"lisi"),
    17. new Person(26,"zhangsan")
    18. ).forEach(consumer);
    19. System.out.println(JSON.toJSONString(lisiList));
    1. /**
    2. * consumer接口测试
    3. */
    4. @Test
    5. public void test_Consumer() {
    6. //① 使用consumer接口实现方法
    7. Consumer<String> consumer = new Consumer<String>() {
    8. @Override
    9. public void accept(String s) {
    10. System.out.println(s);
    11. }
    12. };
    13. Stream<String> stream = Stream.of("aaa", "bbb", "ddd", "ccc", "fff");
    14. stream.forEach(consumer);
    15. System.out.println("********************");
    16. //② 使用lambda表达式,forEach方法需要的就是一个Consumer接口
    17. stream = Stream.of("aaa", "bbb", "ddd", "ccc", "fff");
    18. Consumer<String> consumer1 = (s) -> System.out.println(s);//lambda表达式返回的就是一个Consumer接口
    19. stream.forEach(consumer1);
    20. //更直接的方式
    21. //stream.forEach((s) -> System.out.println(s));
    22. System.out.println("********************");
    23. //③ 使用方法引用,方法引用也是一个consumer
    24. stream = Stream.of("aaa", "bbb", "ddd", "ccc", "fff");
    25. Consumer consumer2 = System.out::println;
    26. stream.forEach(consumer);
    27. //更直接的方式
    28. //stream.forEach(System.out::println);
    29. }

    仔细的看一下你会发现,lambda 表达式返回值就是一个 Consumer;所以forEach 方法可以使用 lamdda 表达式作为参数了。
    除了上面使用的 Consumer 接口,还可以使用下面这些 Consumer 接口。
    IntConsumer、DoubleConsumer、LongConsumer、BiConsumer

    Consumer总结
    看完上面的实例我们可以总结为几点。
    ① Consumer是一个接口,并且只要实现一个 accept 方法,就可以作为一个
    “消费者”输出信息。
    ② 其实,lambda 表达式、方法引用的返回值都是
    Consumer 类型**,所以,他们能够作为 forEach 方法的参数,并且输出一个值。

    2.Supplier实例
    https://blog.csdn.net/sihai12345/article/details/99374583