JDK8日常开发系列:Consumer详解

2019-07-17 10:56:37 浏览数 (2)

代码语言:javascript复制
点击上方“程序员小明”,选择“星标”今晚可以不加班!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 ConsumerandThen(Consumer after)
对给定的参数T执行定义的操作执行再继续执行after定义的操作下面对上述方法进行实例测试:accept(T t)比如将给定的一批用户里面的名称为"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));
结果为:[{"age":22,"name":"lisi"},{"age":23,"name":"lisi"},{"age":26,"name":"lisi"}]
default ConsumerandThen(Consumer after)比如将给定的一批用户里面的名称为"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));
}
结果为:[{"age":23,"name":"lisi"},{"age":26,"name":"lisi"}]
与Consumer相关的接口BiConsumer处理一个两个参数DoubleConsumer处理一个double类型的参数IntConsumer处理一个int类型的参数LongConsumer处理一个long类型的参数ObjIntConsumer处理两个参数,且第二个参数必须为int类型ObjLongConsumer处理两个参数,且第二个参数必须为long类型欢迎在评论区留下你的观点,一起讨论提高。

如果今天的文章让你有新的启发,或者在学习能力的提升上有新的认识,欢迎转发分享给更多人。欢迎各位读者加入程序员小明读者群,在公众号后台回复“报道”或者“学习”即可。

猜你还想看
最容易被问到的N种排序算法!显卡,就是一个男人对自己的交待教妹学 Java:动态伴侣 Groovy
在 Spring Boot 项目中使用 Swagger 文档
JDK8之Optional 的正确使用姿势
Linux(Centos版本)如何快速安装docker

0 人点赞