1.Consumer学习
Function包中Consumer的使用:
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
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接口测试
*/
@Test
public void test_Consumer() {
//① 使用consumer接口实现方法
Consumer<String> consumer = new Consumer<String>() {
@Override
public 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("********************");
//③ 使用方法引用,方法引用也是一个consumer
stream = 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