Java 8引入Lambda表达式,在编写Lambda表达式时,也会随之被编译成一个函数式接口。在java中一般习惯使用Lambda语法来代替匿名内部类,代码简洁,易读。不过目前java对lambda语法的支持仍然有限,且执行效率低,所以项目中不建议使用lambda语法实现。
1.实例化接口
public interface InterfaceTest {
public abstract void aaa();
}
//匿名内部类
@Test
public void method1(){
new InterfaceTest(){
public void aaa(){
System.out.println("**a1**");
}
}.aaa();
}
//lambda语法
@Test
public void method2(){
InterfaceTest interfaceTest =(()->System.out.println("**b1**"));//匿名内部类
interfaceTest.aaa();
}
抽象类不可以使用lambda语法
public abstract class AbstractTest {
public abstract void bbb();
}
// 不能实例化抽象类 以下代码会报错
// AbstractTest abstractTest=(()->System.out.println("***b2***"));
// abstractTest.bbb();
2.实例化实现接口的普通类
public class CommonClass implements InterfaceTest {
public CommonClass() {
}
//想要用lambda通过new普通类实现接口方法的实现需要写此含接口的构造器
public CommonClass(InterfaceTest interfaceTest) {
}
public void ccc(){
System.out.println("cccccc");
}
@Override
public void aaa() {
// TODO Auto-generated method stub
System.out.println("普通类从接口继承");
}
}
//普通方法
@Test
public void method3(){
new CommonClass(new CommonClass(){
public void aaa(){
System.out.println("***b3****");
}
});
}
//lambda语法
@Test
public void method4(){
//实例化 实现接口的普通类
new CommonClass(()->System.out.println("***b3****"));
}
3.lambda具体语法
3.1 定义多个参数有返回值
如果“语句或语句块”有返回值时,如果只有一条语句则可以不输写“return”语句,编译器会自动处理,否则必须加上,如下示
//定义接口
public interface InterfaceTest2 {
public int aaa(int x,int y);
}
@Test
public void method5(){
// 括号内可以有多个参数 ,如果只有返回值可以不写return
InterfaceTest2 interfaceTest21=((x,y) -> x+y );
//如果除了返回值 还要写其他表达式 需要加大括号 和return语句
InterfaceTest2 interfaceTest22=((x,y) -> {System.out.println(x+y);return x+y;});
System.out.println("*******"+interfaceTest2.aaa(5, 6));
}
3.2 可以改变 当前类以内的成员变量而 局部变量 不能修改!
public interface InterfaceTest2 {
public int aaa(int x,int y);
}
public interface InterfaceTest3 {
public void aa(int x,int y);
}
int aa=10;
public void method6(){
int a=10;//需要加final修饰
InterfaceTest2 interfaceTest22=((x,y) -> {a=x+y;return x+y;});//报错Local variable a defined in an enclosing scope must be final or effectively final
InterfaceTest3 interfaceTest3=((x,y) -> aa=x+y );
interfaceTest3.aa(15, 16);
System.out.println(aa); //结果为 31 说明成员变量可以在lambda表达式中被修改
}
3.3在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量(可以与成员变量重名)
int y=10;
@Test
public void method7(){
int x=10;
InterfaceTest3 interfaceTest3=((x,y) -> aa=x+y ); // x报错
}
3.4 使用lambda遍历集合
@Test
public void method8() {
List<String> languages = Arrays.asList("aaa","bbb","ccc");
//使用foreach语句遍历集合
for(String each:languages) {
System.out.println(each);
}
//使用lambda语法遍历
languages.forEach(x -> System.out.println(x));
languages.forEach(System.out::println);
}
网友评论