java.util.function中 Function, Supplier, Consumer, Predicate和其余函数式接口普遍用在支持lambda表达式的API中。这些接口有一个抽象方法,会被lambda表达式的定义所覆盖。java
Consumer的做用顾名思义,是给定义一个参数,对其进行(消费)处理,处理的方式能够是任意操做.程序员
@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); }; } }
其核心方法以下:web
void accept(T t);
对给定的参数T执行定义的操做微信
default Consumer andThen(Consumer<? super T> after)
对给定的参数T执行定义的操做执行再继续执行after定义的操做svg
下面对上述方法进行实例测试:函数
好比将给定的一批用户里面的名称为"lisi"的用户都给打包起来测试
/** * 此处使用lombok插件(值得了解) */ @Data @Accessors(chain = true) @AllArgsConstructor public class Person { private Integer age; private String name; } List<Person> lisiList = new ArrayList<>(); Consumer<Person> consumer = x -> { if (x.getName().equals("lisi")){ lisiList.add(x); } }; 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));
结果为:ui
[{"age":22,"name":"lisi"},{"age":23,"name":"lisi"},{"age":26,"name":"lisi"}]
好比将给定的一批用户里面的名称为"lisi"且年龄大于22岁的用户都给打包起来插件
List<Person> lisiList = new ArrayList<>(); Consumer<Person> consumer = x -> { if (x.getName().equals("lisi")){ lisiList.add(x); } }; consumer = consumer.andThen( x -> lisiList.removeIf(y -> y.getAge() < 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)); }
结果为:code
[{"age":23,"name":"lisi"},{"age":26,"name":"lisi"}]
处理一个两个参数
处理一个double类型的参数
处理一个int类型的参数
处理一个long类型的参数
处理两个参数,且第二个参数必须为int类型
处理两个参数,且第二个参数必须为long类型