函数式接口
了解Lamda表达式,先了解函数式接口(Function interface)
函数式接口的定义
有且仅有一个抽象方法的接口,就是函数式接口.
例如 Runnable接口:
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
@FunctionInterface 注解用来标识这是一个函数式接口(非必须), 当使用此注解时,接口中添加了多抽象方法时就会报红.
lambda表达式示例
函数式接口
@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
}
写出简洁代码的代码 要从娃娃抓起.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。