作为jdk8的另一个特性,lambda给我们带来的便利是不言而喻的。Lambda简而言之就是函数编程,当某个方法的参数需要传接口对象的时候,我们传统方式都需要先创建一个实现这个接口的实例对象并重写抽象方法再传进这个方法才能调用。
举个例子
new Thread(new Runnable(){ @Override public void run(){ sout("hello world"); } }).start();
虽然使用传统方式很多代码不需要我们写但是也是很麻烦很长的,当用了jdk8之后 以上代码可以更改为
new Thread(()->sout("hello world")).start();
我们先来看一下这个lambda表达式的结构 ()->{} 左边的小括号为参数,中间的->为Lambda符号,右边为方法体,这个Thread类的构造方法需要传一个Runnable接口的实例,传统方式我们肯定是创建接口实例重写方法并传进去,但是在Lambda里它可以根据Thread()方法判断出需要的参数类型。Lambda表达式虽然好用但不是任何情况下都可以使用的,能够接收Lambda表达式的参数类型 是一个只包含一个方法的接口。只包含一个方法的接口称之为“函数接口”,这个逻辑很简单,因为这个接口只有一个方法,lambda表达式才可以不用判断直接对唯一的一个方法进行重写。使用lambda可以省去匿名对象的创建而专注于逻辑,简化代码。下面有三个例子可以来了解一下lambda,分为无返回值无参数,无返回值有参数,有返回值。
首先我们创建一个函数接口
public interface FunctionInterface { void test(); }
然后创建一个demo来演示下无参无返回值
public class FunctionInterfaceTest { public static void main(String[] args) { func(() -> { System.out.println("hello"); }); } private static void func(FunctionInterface functionInterface){ functionInterface.test(); } }
在上面的例子中,使用主线程调用func()方法时需要创建一个接口类实例作为参数窜进去才可以,但是使用laambda之后可以更简单。
修改一下接口类,演示有参无返回值
public interface FunctionInterface { void test(int x); }
demo类
public class FunctionInterfaceTest { public static void main(String[] args) { func((int x) -> { System.out.println("hello"); }); } private static void func(FunctionInterface functionInterface) { int x = 1; functionInterface.test(x); } }
在Lambda表达式的左边使用()放参数。当参数只有一个的时候可以省去(),虽然说lambda可以根据上下文来推断出参数的类型 int也可以去掉。但是在参数为泛型的时候容易有错误,我建议还是写好参数类型。
有参有返回值
public interface FunctionInterface { boolean test(int x); }
demo类
public class FunctionInterfaceTest { public static void main(String[] args) { func((int x) -> { if(x==1){ return true; }else return false; }); ; } private static boolean func(FunctionInterface functionInterface) { int x = 1; boolean test = functionInterface.test(x); //test 就是接口抽象方法的返回值。 } }
理一下上面的逻辑,主线程调用同类的静态方法func()。这个方法的参数是一个接口实例,lambda根据这个方法参数判断出接口的类并创建这个实例类重写好test方法传给func()。func()方法获取实现接口的实例来进行逻辑处理。
当某个方法需要某个接口实例作为参数的时候 可以看一下该接口是不是函数接口,如果是的话可以使用lambda来简化代码。