Java8之Lambda表达式
Lambda表达式介绍
Lambda表达式在编程语言Java里面是Jdk8新引进的一个新特性,使用它设计的代码会更加简洁。通过Lambda表达式,可以替代我们以前经常写的匿名内部类来实现接口。Lambda表达式本质是一个匿名函数;
体验Lambda表达式
Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码,它可以写出更简洁、更灵活的代码,作为一种更紧凑的代码风格,通过Lambda表达式,可以替代我们以前经常写的匿名内部类来实现接口,使Java语言表达能力得到了提升。
为什么要使用匿名内部类:实际开发中,一个接口/类的方法的某个实现方式在程序中只会执行一次,但为了使用它,我们需要创建它的实现类/子类去实现/重写。此时可以使用匿名内部类的方式,可以无需创建新的类,减少代码冗余。
原来写匿名函数去实现接口:
package day02;
public class Program1 {
public static void main(String[] args) {
Cal cal = new Cal() {
@Override
public void show() {
System.out.println("这里使用了匿名内部类");
}
};
cal.show();
}
}
interface Cal {
void show();
}
使用了lambda表达式:
package day02;
public class Program1 {
public static void main(String[] args) {
Cal1 cal = () -> {
System.out.println("这里使用了Lambda表达式");
};
cal.show();
}
}
interface Cal1 {
void show();
}
Lambda表达式是JDK8开始后的一种新语法形式。
Lambda表达式语法
我们看下这个Lambda表达式:
(int a,int b) ->{return a+b;};
这个本质是一个函数;
一般的函数类似如下:
int add(int a,int b){
return a+b;
}
有返回值,方法名,参数列表,方法体
Lambda表达式函数的话,只有参数列表,和方法体;
( 参数列表 ) -> { 方法体 }
说明:
( ) :用来描述参数列表;
{ } : 用来描述方法体;
-> :Lambda运算符,可以叫做箭头符号,或者goes to
Lambda表达式细讲
我们搞一个案例,接口方法参数,无参,单个参数,两个参数,有返回值,没有返回值,这六种情况都罗列下:
interface If1{
/**
* 无参数无返回值
*/
void test();
}
interface If2{
/**
* 单个参数无返回值
* @param a
*/
void test(int a);
}
interface If3{
/**
* 两个参数无返回值
* @param a
* @param b
*/
void test(int a,int b);
}
interface If4{
/**
* 无参数有返回值
* @return
*/
int test();
}
interface If5{
/**
* 单个参数有返回值
* @param a
* @return
*/
int test(int a);
}
interface If6{
/**
* 多个参数有返回值
* @param a
* @param b
* @return
*/
int test(int a,int b);
}
用Lambda表达式实现:
// 无参数无返回值
If1 if1=()->{
System.out.println("无参数无返回值");
};
if1.test();
// 单个参数无返回值
If2 if2=(int a)->{
System.out.println("单个参数无返回值 a="+a);
};
if2.test(3);
// 两个参数无返回值
If3 if3=(int a,int b)->{
System.out.println("两个参数无返回值 a+b="+(a+b));
};
if3.test(2,3);
// 无参数有返回值
If4 if4=()->{
System.out.print("无参数有返回值 ");
return 100;
};
System.out.println(if4.test());
// 单个参数有返回值
If5 if5=(int a)->{
System.out.print("单个参数有返回值 ");
return a;
};
System.out.println(if5.test(200));
// 多个参数有返回值
If6 if6=(int a,int b)->{
System.out.print("多个参数有返回值 ");
return a+b;
};
System.out.println(if6.test(1,2));
Lambda表达式精简语法
Lambda表达式省略规则:
1、参数类型可以省略
2、假如只有一个参数,参数类型可以省略,同时()括号可以省略
3、如果方法体只有一条语句,{}大括号可以省略,同时省略分号。
4、如果方法体中唯一的语句是return返回语句,那省略大括号的同时return也要省略,分号也要省略。
改写实例:
public class Program2 {
public static void main(String[] args) {
// 1,参数类型可以省略
// 2,假如只有一个参数,()括号可以省略
// 3,如果方法体只有一条语句,{}大括号可以省略
// 4,如果方法体中唯一的语句是return返回语句,那省略大括号的同事return也要省略
// 无参数无返回值
If1 if1=()->System.out.println("无参数无返回值");
if1.test();
// 单个参数无返回值
If2 if2=a->System.out.println("单个参数无返回值 a="+a);
if2.test(3);
// 两个参数无返回值
If3 if3=(a,b)->{
System.out.println("两个参数无返回值 a+b="+(a+b));
};
if3.test(2,3);
// 无参数有返回值
If4 if4=()->100;
System.out.println(if4.test());
// 单个参数有返回值
If5 if5=a->{
System.out.print("单个参数有返回值 ");
return a;
};
System.out.println(if5.test(200));
// 多个参数有返回值 参数类型可以省略
If6 if6=(a,b)->a+b;
System.out.println(if6.test(1,2));
}
}
方法引用
官网对方法引用的描述
您可以使用 lambda 表达式来创建匿名方法。然而,有时 lambda 表达式除了调用现有方法之外什么都不做。在这些情况下,按名称引用现有方法通常会更清楚。方法引用使您能够做到这一点;它们是用于已具有名称的方法的紧凑、易于阅读的 lambda 表达式。
语法是:对象::方法
假如是static方法,可以直接 类名::方法
实例如下:
public class Program2 {
public static void main(String[] args) {
// 方法引用
// 语法:
// static方法 类名::方法名
// 普通方法 对象名::方法名
Program2 program2=new Program2();
If5 if5=program2::test;
If5 if52=Program2::test2;
System.out.println(if5.test(1));
System.out.println(if52.test(1));
}
public int test(int a){
return a-2;
}
public static int test2(int a){
return a-2;
}
}
@Functionalinterface
interface If5 {
/**
* 单个参数有返回值
*
* @param a
* @return
*/
int test(int a);
}
写在文末:Lambda表达式并不能简化所有匿名内部类,其只能简化函数式接口匿名内部类的写法形式,且接口中有且仅有一个抽象方法,通常,我们会再接口上加上一个@Functionalinterface
注解,标记该接口必须是满足函数式接口。