刘小路1992 2022-05-07 14:58 采纳率: 100%
浏览 46
已结题

关于lambda表达式的一些疑问

@FunctionalInterface
public interface Consumer<T> {


    void accept(T t);

    
    default Consumer<T> andThen(Consumer<? super T> after) {
       

  //这个accept为什么没有循环调用,按照正常理解,表达式里面accept(t)调用的还是自己的 accept
          return (T t) -> { accept(t); after.accept(t); };
    }
}

public void test () {
       Consumer<Number> aa = new Consumer<Number>() {
            @Override
            public void accept(Number number) {

            }
        };

        Consumer bb = aa.andThen(new Consumer<Number>() {
            @Override
            public void accept(Number number) {

            }
        });
      bb.accept(1);  //此时先调用 bb lambda表达式里面的accept, 然后accept 又调用了 accept,这个不是调用bb 自己的accept了吗,为啥会调用aa的accept
}

  • 写回答

1条回答 默认 最新

  • 猫巳 Java领域优质创作者 2022-05-07 15:25
    关注
    (T t) -> { accept(t); after.accept(t); };
    

    这个的意思可以换成常规格式

    new Consumer<T>() {
                @Override
                public void accept(T t) {
                    Consumer.this.accept(t);
                    after.accept(t);
                }
            };
    

    所以bb.accept在执行的时候相当于分别执行了aa.accept和andThen中的accept。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 5月15日
  • 已采纳回答 5月7日
  • 创建了问题 5月7日

悬赏问题

  • ¥20 控制ic卡让喇叭发出不同声音
  • ¥18 关于#ubuntu#的问题:使用背景-工作职责内有七八台ubuntu系统的电脑,平时需要互相调取资料,想实现把这几台电脑用交换机组成一个局域网,来实现指定文件夹的互相调取和写入
  • ¥20 求一个简易射频信号综测仪
  • ¥15 esp8266 tally灯 接收端改为发射端
  • ¥30 Labview代码调用access 数据库,相同代码其中一个调用不出来是为什么
  • ¥15 基于51单片机的交通灯系统,找改程序有点急
  • ¥15 java启动jar包后,运行过程中宕机
  • ¥15 进行LM运算过程中出现了无法识别的问题,具体问题如下图
  • ¥500 高有偿提问!求优化设计微信小程序
  • ¥15 matlab在安装时报错 无法找到入口 无法定位程序输入点