zoukankan      html  css  js  c++  java
  • JDK8日常开发系列: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定义的操作

    下面对上述方法进行实例测试:

    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 Consumer andThen(Consumer<? super T> 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<T, U>

    处理一个两个参数

    • DoubleConsumer

    处理一个double类型的参数

    • IntConsumer

    处理一个int类型的参数

    • LongConsumer

    处理一个long类型的参数

    • ObjIntConsumer

    处理两个参数,且第二个参数必须为int类型

    • ObjLongConsumer

    处理两个参数,且第二个参数必须为long类型

    转载来自https://blog.csdn.net/x851288986/article/details/95816253

  • 相关阅读:
    Xml 映射文件中,除了常见的 select|insert|updae|delete 标签之外,还有哪些标签?
    zookeeper 是如何保证事务的顺序一致性的?
    什么是 Callable 和 Future?
    MyBatis 实现一对一有几种方式?具体怎么操作的?
    Zookeeper 对节点的 watch监听通知是永久的吗?为什么 不是永久的?
    合同测试你懂什么?
    查看各类环境变量用什么命令?
    我们如何进行跨功能测试?
    怎么查看系统支持的所有信号?
    Mybatis 是否支持延迟加载?如果支持,它的实现原理是什么?
  • 原文地址:https://www.cnblogs.com/tangliMeiMei/p/13052454.html
Copyright © 2011-2022 走看看