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