关于Lambda和匿名内部类

先上代码

//g=cache(f)
    public <T,R> Function<T,R> cache(Function<T,R> f){
        final Map<T,R> cache=new HashMap<>();
        Function<T,R> g=t->{
            if(cache.containsKey(t)){
                System.out.println("cached t:"+t);
                return cache.get(t);
            }
            System.out.println("not cached t:"+t);
            R r=f.apply(t);
            cache.put(t, r);
            return r;
        };
        return g;
//      return new Function<T,R>(){
//          final Map<T,R> cache=new HashMap<>();
//
//          @Override
//          public R apply(T t) {
//              if(cache.containsKey(t)){
//                  System.out.println("cached t:"+t);
//                  return cache.get(t);
//              }
//              R r=f.apply(t);
//              System.out.println("not cached t:"+t);
//              cache.put(t, r);
//              return r;
//          }
//          
//      };
    }

这是网上的一篇文章后面留的习作,题目是传入一个函数f,返回一个等效的cache版本函数g。题目本身没什么,只是在我实现的过程中对两种方法有一些感想,列在下面以作备忘。

  • 要清楚自由变量和限定变量的区别
  • 仅从效果来看lambda写起来简洁,但不如内部类灵活
  • 匿名内部类编译后会生成一个顶层类,编译器自动生成的构造函数里,第一个参数必定是包装类的引用,其余的参数依次是捕获的自由变量。
  • lambda不会生成另外的类(没有发现class文件)
  • lambda对应invokedaynamic指令

一些扩展阅读的博客文章
通过字节码分析JDK8中Lambda表达式编译及执行机制
java8 lambda学习笔记之编译与运行过程
Java8学习笔记(4) -- Lambda表达式实现方式
Lambda表达式

转载于:https://www.cnblogs.com/batz/p/memo_java_lambda_anonymous-inner-class.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值