项目整体概图
1 Lambda表达式
1.1 概述:只有一个抽象方法的接口
1.2 【比较】lambda表达式、匿名内部类
1.3 基本语法
(参数)->表达式 或 (参数)->{方法体;}
(1)形参列表
形参列表允许省略形参类型,如形参列表中只有一个参数,形参列表的圆括号也可以省略
(2)箭头(->)
必须通过英文的划线号和大于符号组成
(3)代码块
如果代码块中只包含一条语句,则lambda表达式允许省略代码块的花括号
(4)返回值
如果代码块只有一条return语句,则可以省略return关键字
(5)函数形参
lambda表达式可以直接作为函数的参数
(6)lambda表达式类型
- Lambda表达式的类型(也被称为"目标类型(target type)"),Lambda表达式的目标类型必须是"函数式接口(functional interface)"。
- 函数接口(Java 8新引入的概念),定义:只有一个显示声明抽象方法的接口
- 函数接口通常使用@FunctionalInterface标注出来 (也可以不标记),函数式接口可以包含多个default或static方法,但是只能声明一个抽象方法,@FuctionalInterface主要作用就是检查当前接口是不是函数接口
- 若想使用lambdaname目标必须是一个函数接口
(7)lambda表达式中变量的使用
如果是全局的变量直接用,如果是局部变量会被默认在前面添加final(被作为常量,类似于局部变量在局部内部类中使用的情况)
1.4 【样例】
import org.junit.Test;
public class Demo2 {
public static void main(String[] args) {
fun();
}
//@Test
public static void fun() {
//1.没有参数的
InterA a = ()->{
System.out.println("没有参数");
};
a.showA();
//简化
InterA aa = ()->System.out.println("没有参数");
aa.showA();
//2.一个参数的
InterB b = (ib)->{
System.out.println("一个参数:"+ib);
};
b.showB(4);
//简化
InterB bb = (ib)->System.out.println("一个参数:"+ib);
bb.showB(5);
//3.两个参数的
InterC c = (ia,ib)->{
int sum = ia+ib;
System.out.println("两个参数:"+" ia:"+ia+" ib:"+ib+" sum:"+sum);
};
c.showC(4, 6);
//简化
InterC cc = (ia,ib)->System.out.println("两个参数:"+" ia:"+ia+" ib:"+ib);
cc.showC(4, 5);
//4.返回值
InterD d = (i,j)->{
int sum = i+j;
//System.out.println("sum:"+sum);
return sum;
};
int value = d.showD(4, 6);
System.out.println(value);
//简化 简化版的不需要写return
InterD dd = (i,j)->i+j;
int value1 = dd.showD(4, 7);
System.out.println(value1);
//5.lambda表达式作为参数
fun2(
new InterC() {public void showC(int a, int b) {}}
);
fun2((i,j)->System.out.println("lambda表达式作为参数"+" i:"+i));
//7.lambda表达式中变量的使用
String value11 = "hello world";
InterA aaa = ()->{
System.out.println(value11);
//value11是final类型的是一个常量,值是不能改变的
//value11 = "haha";
};
aaa.showA();
}
public static void fun2(InterC c) {
c.showC(4, 6);
}
}
interface InterA{
public void showA();
}
interface InterB{
public void showB(int a);
}
interface InterC{
public void showC(int a,int b);
}
interface InterD{
public int showD(int a,int b);
}
@FunctionalInterface
interface InterE{
public int showD(int a,int b);
//public int showY(int a,int b);
}
1.5 方法引用与构造器引用
1.5.1 引用类方法
1.5.2 引用特定对象的实例方法