java.util.function中 Function, Supplier, Consumer, Predicate和其他函数式接口广泛用在支持lambda表达式的API中。这些接口有一个抽象方法,会被lambda表达式的定义所覆盖。
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); };
}
}
其核心方法如下:
-
void accept(T t);
对给定的参数T执行定义的操作
-
default Consumer<T> andThen(Consumer<? super T> after)
对给定的参数T执行定义的操作执行再继续执行after定义的操作
下面对上述方法进行实例测试:
accept(T t)
比如将给定的一批用户里面的名称为"lisi"的用户都给打包起来
List<Person> lisiList = new ArrayList<>();
Consumer <Person> consumer = x -> {
if (x.name.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));
结果为:
[{"age":22,"name":"lisi"},{"age":23,"name":"lisi"},{"age":26,"name":"lisi"}]
default Consumer<T> andThen(Consumer<? super 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));
结果为:
[{"age":23,"name":"lisi"},{"age":26,"name":"lisi"}]
与Consumer<T>相关的接口
-
BiConsumer<T, U>
处理一个两个参数
-
DoubleConsumer
处理一个double类型的参数
-
IntConsumer
处理一个int类型的参数
-
LongConsumer
处理一个long类型的参数
-
ObjIntConsumer<T>
处理两个两个参数,且第二个参数必须为int类型
-
ObjLongConsumer<T>
处理两个两个参数,且第二个参数必须为long类型
网友评论