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

  • 相关阅读:
    14-6-27&28自学内容小结
    暑假要自学Java了
    找最大值算法(面试题)
    冒泡排序(面试题)
    循环
    运算符和表达式 、 分支结构 使用三目运算符的嵌套,比较a、b、c三个整数的大小并输出结果
    运算符和表达式 、 分支结构 输入年份和月份,输出该月的天数(使用switch-case)
    运算符和表达式 、 分支结构 3 个数值进行升序排列
    运算符和表达式 、 分支结构 例题 闰年判断
    变量 、 JAVA基本类型 3.3.5. 关于“短路逻辑”的问题
  • 原文地址:https://www.cnblogs.com/tangliMeiMei/p/13052454.html
Copyright © 2011-2022 走看看