1.Consumer学习
Function包中Consumer的使用:
java.util.function中 Function, Supplier, Consumer, Predicate和其他函数式接口广泛用在支持lambda表达式的API中。这些接口有一个抽象方法,会被lambda表达式的定义所覆盖。
Consumer的作用顾名思义,是给定义一个参数,对其进行(消费)处理,处理的方式可以是任意操作.
@FunctionalInterfacepublic 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); };}}
其核心方法如下:
- void accept(T t);
对给定的参数T执行定义的操作 - default Consumer
andThen(Consumer<? super T> after)
对给定的参数T执行定义的操作执行再继续执行after定义的操作
下面对上述方法进行实例测试:
比如将给定的一批用户里面的名称为”lisi”且年龄大于22岁的用户都给打包起来
List<Person> lisiList = new ArrayList<>();Consumer <Person> consumer = x -> {if (x.name.equals("lisi")){lisiList.add(x);}};consumer = consumer.andThen(x -> lisiList.removeIf(y -> y.age < 23));Stream.of(new Person(21,"zhangsan"),new Person(22,"lisi"),new Person(23,"wangwu"),new Person(24,"wangwu"),new Person(23,"lisi"),new Person(26,"lisi"),new Person(26,"zhangsan")).forEach(consumer);System.out.println(JSON.toJSONString(lisiList));
/*** consumer接口测试*/@Testpublic void test_Consumer() {//① 使用consumer接口实现方法Consumer<String> consumer = new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);}};Stream<String> stream = Stream.of("aaa", "bbb", "ddd", "ccc", "fff");stream.forEach(consumer);System.out.println("********************");//② 使用lambda表达式,forEach方法需要的就是一个Consumer接口stream = Stream.of("aaa", "bbb", "ddd", "ccc", "fff");Consumer<String> consumer1 = (s) -> System.out.println(s);//lambda表达式返回的就是一个Consumer接口stream.forEach(consumer1);//更直接的方式//stream.forEach((s) -> System.out.println(s));System.out.println("********************");//③ 使用方法引用,方法引用也是一个consumerstream = Stream.of("aaa", "bbb", "ddd", "ccc", "fff");Consumer consumer2 = System.out::println;stream.forEach(consumer);//更直接的方式//stream.forEach(System.out::println);}
仔细的看一下你会发现,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
