java的匿名内部类和lambda表达式

今天在学习redis过程中,遇到一段代码:

redis.execute(jedis->{
            System.out.println(jedis.ping());
        });

代码很简约

//Redis类,上面的execute就是调用的这里的方法
public class Redis {
    private JedisPool pool;

    public Redis(){
        GenericObjectPoolConfig<Object> config = new GenericObjectPoolConfig<>();
        pool=new JedisPool(config,"192.168.2.20");
    }

    public void execute(CallWithJedis callWithJedis){
        try(Jedis jedis = pool.getResource()){
            callWithJedis.call(jedis);
        }
    }
}
//这里是一个接口
public interface CallWithJedis {
    void call(Jedis jedis);
    void say();
}

代码是lambda写法,这是JDK8以上有的新特性;
经过自己翻阅资料理解把这段代码进行复写:

Redis redis = new Redis();
        redis.execute(jedis->{
            System.out.println(jedis.ping());
        });
        //最原始的写法
        class imp implements CallWithJedis{

            @Override
            public void call(Jedis jedis) {
                System.out.println(jedis.ping());
            }
        }
        redis.execute(new imp());
        //第二种写法
        redis.execute(new CallWithJedis() {
            @Override
            public void call(Jedis jedis) {
                System.out.println(jedis.ping());
            }
        });

注意点:
1. 需要搞清楚什么时候可以使用lambda写法实现匿名内部类
虽然使用 Lambda 表达式可以对某些接口进行简单的实现,但并不是所有的接口都可以使用 Lambda 表达式来实现。
Lambda表达式只支持函数式接口 也就是只有一个抽象方法的接口。
在这里插入图片描述
可以通过FunctionalInterface注解,上该注解能够更好地让编译器进行检查。
如果编写的不是函数式接口,但是加上了@FunctionInterface,那么编译器会报错,如上图所示。
在这里插入图片描述
这才是一个函数式接口。
2. 搞清楚匿名内部类
匿名内部类使用的前提是:实现一个接口或者是抽象方法。
匿名内部内使用的优点:

  • 内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据;
  • 内部类可以对同一个包中的其他类隐藏起来;
  • 使用匿名内部类定义回调函数,节省代码;

3. 搞清楚lambda的使用
语法形式为 () -> {},其中 () 用来描述参数列表,{} 用来描述方法体,-> 为 lambda运算符
如果是函数式接口实现,{}就是在写接口里的函数方法:
以上面的例子:

redis.execute(jedis->{
            ***System.out.println(jedis.ping());***
        });
        //{}里面的代码就是在实现接口CallWithJedis中的void call(Jedis jedis);jedis就是参数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值