package lambda; /** * Created by ding on 2018-3-22. * Lambda表达式的目的就是为了简化接口式的匿名内部类,要使用Lamdba表达式前提是接口中只有一个抽象方法,这个接口被叫做函数式接口 */ public class LamdbaDemo { public static void main(String[] args) { //lambda 表达式语法 //好处是:1.代码简洁 2.不会产生实现类的class文件 IEat eat = ()->{System.out.println("eat orange");}; //lambda 表达式语句块中只有一局代码市可以省略{} IEat eat = ()->System.out.println("eat orange"); eat.eat(); eat.defaultMethod(); //带有参数的Lambda IEat eat = (thing , i )->{ System.out.println("eat.."+ thing + ".." + i + "..斤" ); }; eat.eat("apple" , 10); //带有返回值的lambda IEat eat = (thing , i )->{ System.out.println("eat.."+ thing + ".." + i + "..斤" ); return "吃完了"; }; //带有返回值的lambda , 并且代码块只有一行代码时,return 都可以省略 IEat eat = (thing , i ) -> thing + " 吃完了,吃了 " + i; System.out.println( eat.eat("apple" , 10)); //参数中使用final关键字,可以用简单变量接受,也可以写全, //这种写发有个问题接口规定的thing 变量引用不能改变。但是我在lambda里仍然可以改变引用 IEat eat = (thing , i ) -> { thing = new String("22"); return thing; }; //然而这种写法确实是:thing 引用不能改变, 并且必须i 变量要写全类型。 IEat eat2 = (final String thing , int i ) -> { thing = new String("22");//此处编译报错 Cannot assign a value to final variable 'thing' return thing; }; System.out.println( eat.eat("apple" , 10)); } } //只有一个抽象方法的接口 @FunctionalInterface interface IEat{ public String eat(final String thing , int i ); //jdk 1.8新增的 default void defaultMethod(){ System.out.println("接口中的dafault方法"); } //jdk 1.8新增、 static void staticMethod(){ System.out.println("接口中的静态方法"); } } //class EatImpl implements IEat{ // @Override // public void eat() { // System.out.println("eat apple"); // } //}
特别注意:
Comparator 类 虽然看上去有两个 抽象方法,但是equal 是object 的 所以不算,所以Comparator 可以使用lambda ,注意@FunctionalInterface 注解也是表明该类是函数式接口