Consumer详解

作者: felayman | 来源:发表于2017-10-12 11:53 被阅读1055次

    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类型

    相关文章

      网友评论

        本文标题:Consumer详解

        本文链接:https://www.haomeiwen.com/subject/ofynyxtx.html