ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java8新特性 consumer

2021-09-20 18:01:27  阅读:575  来源: 互联网

标签:consumer after 接口 accept 特性 println Consumer Java8


个人公众号,欢迎关注下:小蜗牛会飞

Java8新特性 consumerJava8的一个新特性-consumerhttps://mp.weixin.qq.com/s/YIddXxQvW18ic73O3Jl_0w

今天来聊聊Java8的一个新特性-consumer,这个是在项目中发现同事用过,所以就研究研究一下。

consumer从字面上面来理解就是消费的意思,用过mq的,应该大概可以了解到意思。    

我们先来看看Java8定义的这个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); };
    }
}

该接口被@FunctionalInterface注解修饰,这个注解的意思代表的是这个接口只有一个抽象接口方法,如果超过一个,只不能不用该接口,会编译不通过。

该接口有一个抽象方法accept,接受的是泛型T的一个参数类型,这个方法是在consumer的实例显示被调用之后,那么指定的函数式表达式才会被执行,请看下面例子:​​​​​​​

// 构造函数式表达,并赋值于consumer对象,其中此时泛型已经被指定为Integer了
// 所以此时调用accept方法时,传入的对象必须一一对应传入Integer类型
Consumer<Integer> consumer = x -> {
            int a = x + 2;
            System.out.println(a);// 12
            System.out.println(a + "_");// 12_
        };
        // 显示调用,consumer中的函数式方法才会调用,可以理解为预先
        // 定义好要执行的代码逻辑,等到要执行的时候才显示的执行,这在项目中
        // 的需求还是很大,比如数据还没有到达,则此时可以等到数据到达之后才调用
        consumer.accept(10);

该接口方法还有另外一个默认实现方法andThen,从方法名很容易知道,先执行本接口方法的accept方法,之后再执行after的accept方法,请看下面代码:​​​​​​​

/**传入一个Consumer类型的参数,
   *他的泛型类型,
   *跟本接口是一致的T,先做本接口的accept操作,
   *然后在做传入的Consumer类型的参数的accept操作
  */
    default Consumer<T> andThen(Consumer<? super T> after) {
        Objects.requireNonNull(after);
        return (T t) -> { accept(t); after.accept(t); };
    }

例子:​​​​​​​

public class TestConsumer {

    public static void main(String[] args) {
    // 定义第一个consumer表达式
        Consumer<Integer> consumer = x -> {
            int a = x + 2;
            System.out.println(a);// 8
            System.out.println(a + "_");// 8_
        };
        // 定义第二个consumer表达式
        Consumer<Integer> after = x -> {
            int a = x * 2;
            System.out.println(a);// 12
            System.out.println(a + "_");// 12_
        };
       // 调用方式,先执行第一个consumer表达式,执行完之后将参数直接传递给
       // 后面的after表达式继续执行,这个场景可以用于相同入参不同方法先后执行顺序,
        consumer.andThen(after).accept(6);

    }
}

运行结果:

88_1212_

标签:consumer,after,接口,accept,特性,println,Consumer,Java8
来源: https://blog.csdn.net/sober_snail/article/details/120393617

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有