Lambda表达式
一、Lambda表达式简介
什么是Lambda表达式?
Lambda是Java 8添加的一个新的特性。其实就是一个匿名函数。
为什么要使用Lambda表达式?
使用Lambda表达式可以对一个接口进行非常简洁的实现。
Lambda对接口的要求是什么?
虽然可以使用lambda表达式对某些接口进行简单的实现,但是并不是所有的接口都可以用lambda表达式实现。
要求接口中定义的必须要实现的抽象方法只能是一个。
在Java 8中对接口加了一个新的特性:default。
对于只有一个抽象方法的接口,称为函数式接口。
@FunctionalInterface
修饰函数式接口的。接口中的抽象方法只有一个否则报错。
下面的代码段展示了一个函数式接口分别用实现类、匿名函数、lambda表达式实现:
package lambda;
public class Program {
public static void main(String[] args) {
//1.使用接口实现类
Comparator comparator=new MyComparator();
//2.使用匿名内部类
Comparator comparator1=new Comparator() {
public int compare(int a,int b) {
return a-b;
}
};
//3.使用Lambda表达式来实现接口
Comparator comparator2= (a,b)->a-b ;
}
}
class MyComparator implements Comparator{
public int compare(int a,int b) {
return a-b;
}
}
定义接口:
package lambda;
interface Comparator {
int compare(int a,int b);
}
Lambda表达式语法
基本语法:
( ):表示参数列表,不需要指定参数的类型,会自动推断
->:连接符
{ }: 表示方法体
具体语法看代码:
package lambda;
public class TestLambda {
public static void main(String[] args) {
//匿名内部类的方式实现,在Java8之前,没有Lambda表达式
UserTest ut=new UserTest() {
public void test() {
System.out.println("使用匿名内部类实现");
}
};
ut.test();
//():表示参数列表,不需要指定参数的类型,会自动推断
//->:连接符
//{}: 表示方法体
UserTest ut1=()->{
System.out.println("使用lambda表达式实现");
};
ut1.test();
//如果方法体只有一句话,可以省略大括号以及省略一个分号。
UserTest ut2=()->System.out.println("最简化的lambda表达式实现");
ut2.test();
int i=100;
//圆括号里面只需要知道参数的名称,不需要参数的类型
//数据类型自动根据函数式接口的定义推断。
UserTest1 ut3=(x)->{
System.out.println("一个参数,一行代码输出参数的值:"+x);
};
ut3.test(i);
//如果参数列表里面只有一个参数可以省略圆括号。
UserTest1 ut4=x->{
System.out.println("一个参数,省略圆括号,一行代码输出参数的值:"+x);
};
ut4.test(i);
//
UserTest2 ut5=(x,y)->{
System.out.println("两个参数:"+x);
System.out.println("两个参数:"+y);
};
ut5.test(2,19);
UserTest3 ut6=x->{
x=x+10;
return x;
};
int io=ut6.test(15);
System.out.println(io);//25
//如果省略了大括号,return一定也要省略掉。
//代码里面的表达式返回值会自动作为方法的返回值
UserTest3 ut7=x->x+10;
int o=ut7.test(15);
System.out.println(o);//25
}
}
//没有参数,没有返回值
@FunctionalInterface
interface UserTest{
void test();
//void test2(); //因为前面有@FunctionalInterface,所以报错
//default关键字表示默认实现,所以可以有下面方法而不报错
default void test3() {}
}
//接口方法有一个参数,无返回值
@FunctionalInterface
interface UserTest1{
void test(int i);
}
//接口方法有两个参数,无返回值
@FunctionalInterface
interface UserTest2{
void test(int i ,int j);
}
//接口方法有一个参数,有返回值
@FunctionalInterface
interface UserTest3{
int test(int i);
}
运行结果: