了解Lamda表达式,先了解函数式接口(Function interface)
函数式接口的定义java
有且仅有一个抽象方法的接口,就是函数式接口.
例如 Runnable接口:
@FunctionalInterface public interface Runnable { public abstract void run(); }
@FunctionInterface 注解用来标识这是一个函数式接口(非必须), 当使用此注解时,接口中添加了多抽象方法时就会报红.
函数式接口
@FunctionalInterface public interface TestFunctionInterface { void max(int i); }
匿名内部类和Lambda表达式比较
@Test public void test1(){ //匿名内部类 TestFunctionInterface t1 = new TestFunctionInterface() { @Override public void max(int i) { System.out.println("t1输出 :"+i); } }; // Lambda表达式 TestFunctionInterface t2 = (int i)->System.out.println("t2输出:" + i); TestFunctionInterface t3 = (int i)->{System.out.println("t3输出:" + i);}; t1.max(20); //t1输出 :20 t2.max(20); //t2输出:20 t3.max(20); //t3输出:20 }
当Lambda表达式方法体只有一句时能够省略大括号不写
TestFunctionInterface t2=(int i)-> ++i; System.out.println("t2输出:" + i); /* 此时即便两句在一行,可是依旧会报找不到i的错误. java中一个分号(;)表示一句话的结束, 就会断定System.out.println("t2输出:"+i);语句已经不在Lambda表达式的做用域内 下面加上大括号表示做用域之后就能够正常进行运算输出 */ TestFunctionInterface t2=(int i)->{ ++i; System.out.println("t2输出:" + i); };
到这发现Lambda比传统匿名内部类简洁了许多,可是还没完.
继续简化参数类型和参数括号
@Test public void test5(){ TestFunctionInterface t5=(i,j)-> System.out.println("t5输出:"+i*j); t5.max(20,10); //t5输出:200 } /* 当函数式接口的抽象方法只有一个参数时, 又能够将参数外面的括号省略不写*/ @Test public void test6(){ TestFunctionInterface t6= i -> System.out.println("t6输出:"+i); t6.max(20); //t6输出:20 }
写出简洁代码的代码 要从娃娃抓起.ide