lamda表达式
java8的新特性
第一课:
lamda简单示例
package lamda;
/**
* @author Fegert
* @version 2019年9月18日 下午7:55:53
*
*/
public class lamdaTest {
public static void main(String[] args) {
// 1.使用接口实现类的方式
Comparator comparator1 = new MyComparator();
// 2.使用匿名内部类
Comparator comparator2 = new Comparator() {
@Override
public int compare(int a, int b) {
return a - b;
}
};
// 3.使用lamda表达式
Comparator comparator = (a, b) -> a - b;
}
}
class MyComparator implements Comparator {
@Override
public int compare(int a, int b) {
// TODO Auto-generated method stub
return a - b;
}
}
@FunctionalInterface
interface Comparator {
int compare(int a, int b);
}
-
lamda实质是一个匿名函数
返回值类型函数名参数 方法体 -
lamda表达式的作用
对某些接口进行简单实现,但不是所有接口都可以由lamda表达式来实现;
-
接口类型需求
接口必须实现的方法必须只有一个
Java8中的default 可以给接口默认实现方法
-
@FunctionalInterface 注解
判断接口是否为函数式接口
第二课:
lamda 基础语法
src.lamdainterface包下的一系列接口
package lamdaInterface;
//无参无返回值
@FunctionalInterface
public interface LamdaNoneReturnNoneParameter {
void test();
}
package lamdaInterface;
//单参数无返回值
public interface LamdaNoneReturnSingleParameter {
void test(int a);
}
package lamdaInterface;
//多参数无返回值
@FunctionalInterface
public interface LamdaNoneReturnMutipleParameter {
void test(int a,int b);
}
package lamdaInterface;
//无参数有返回值
public interface LamdaSingleReturnNoneParameter {
int test();
}
package lamdaInterface;
//单参数有返回值
public interface LamdaSingleReturnSingleParameter {
int test(int a);
}
package lamdaInterface;
//多参数有返回值
@FunctionalInterface
public interface LamdaSingleReturnMutipleParameter {
int test(int a,int b);
}
lamda实质就是一个匿名函数
函数考虑四个点:返回值类型 函数名 参数 方法体
lamda表达式:
返回值类型函数名参数 方法体
lamda基础语法
- ():用来描述参数表
- { } :用来描述方法体
- -> :lamda 运算符 读作goes to
对上述的六个接口使用amda 表达式的基本使用示例:
package lamda;
import lamdaInterface.LamdaNoneReturnMutipleParameter;
import lamdaInterface.LamdaNoneReturnNoneParameter;
import lamdaInterface.LamdaNoneReturnSingleParameter;
import lamdaInterface.LamdaSingleReturnMutipleParameter;
import lamdaInterface.LamdaSingleReturnNoneParameter;
import lamdaInterface.LamdaSingleReturnSingleParameter;
public class LamdaAnotherTest {
public static void main(String[] args) {
/**无参 无返回
* void test();
*flag 1
*/
LamdaNoneReturnNoneParameter lamda1=()->{
System.out.println("lamda1");
};
lamda1.test();
/**单参数 无返回值
* void test(int a);
*flag 2
*/
LamdaNoneReturnSingleParameter lamda2=(int a)->{
System.out.println(a);
};
lamda2.test(10);
/**多单数 无返回值
* void test(int a,int b);
*flag 3
*/
LamdaNoneReturnMutipleParameter lamda3=(int a,int b)->{
System.out.println(a+b);
};
lamda3.test(1,21);
/**无参数 有返回值
* int test();
* flag 4
*/
LamdaSingleReturnNoneParameter lamda4=()->{
System.out.println("lamda4");
return 10;
};
int ref=lamda4.test();
System.out.println(ref);
/**单参数 有返回值
* int test(int a);
* flag 5
*/
LamdaSingleReturnSingleParameter lamda5=(int a)->{
System.out.println(a);
return a;
};
lamda5.test(1);
/**多单数 有返回值
* int test(int a,int b);
* flag 6
*/
LamdaSingleReturnMutipleParameter lamda6=(int a,int b)->
{
System.out.println(a+b);
return a+b;
};
lamda6.test(1,2);
}
}
思考问题:代码依旧很长且繁琐,能否进一步精简化?接口中定义了返回值类型,那么能否舍去return字段呢?
第三课
amda语法精简
- 参数类型
由于在接口的抽象方法中已经定义了接口的参数的数量和类型,所以在lamda表达式中参数的类型可以省略
备注:如果要省略类型,所有参数都得省略。不能一个参数省略类型,一个参数不省略类型。
LamdaNoneReturnMutipleParameter lamda3=( a, b)->{
System.out.println(a+b);
};
- 参数小括号
如果参数列表中,参数的数量只有一个;此小括号可以省略。
LamdaNoneReturnSingleParameter lamda2= a ->{
System.out.println(a);
};
- 方法大括号
如果方法体只有一句,此大括号可以省略
LamdaNoneReturnSingleParameter lamda2= a -> System.out.println(a);
**如果方法体中只有一条语句且是一个返回语句,则省略大括号的同时 ,也 必须 省略掉return;
LamdaSingleReturnMutipleParameter lamda6=(a ,b) -> a+b;
第四课
https://www.bilibili.com/video/av49457747/?p=5