今天在学习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就是参数