## lambda 表达式
匿名函数, 可以理解为一段可以传递的代码
转换的规则: 删去能够确定(or可以通过推断得出)的东西(例: 只有一个函数, 那么不需要写函数名)
实质:
- 一方面, lambda 表达式作为接口的实现类的对象
- 一方面, lambda 表达式为匿名函数
(万物皆对象)
```java
/**
* lambda 表达式的使用
* (x, x) -> xx
* -> : lambda操作数 or 箭头操作符
* ->的左边是lambda的形参列表, 对应要重写接口仲的抽象方法的形参列表
* ->的右边是lambda体, 对应接口实现类要重写的方法的方法体
*/
// 当只有一个方法时, 才不需要写方法名. 不然分不清使用哪一个方法
```
1. 无参, 无返回值
```java
@Test
public void test1(){
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("广州");
}
};
r1.run(); // 调用线程
System.out.println("============================");
Runnable r2 = () -> System.out.println("广州"); // 去掉确定的信息
r2.run(); // 调用线程
}
```
运行结果:
![1.运行结果](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/06ceb809d5e84a63877c7f8f232f4ea8~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=372&h=115&s=4513&e=png&b=272935)
2. 1个形参, 没有返回值
```java
@Test
public void test2(){
Comparator
@Override
public int compare(Integer o1, Integer o2) {
return Integer.compare(o1, o2);
}
};
int compare1 = com1.compare(1,3); // 比较对象大小
System.out.println(compare1); // 前一个数小 -> -1
System.out.println("====================");
// 只有一个方法 不需要写方法名(省略确定的东西, 如 Integer, @override ...)
Comparator
int compare2 = com2.compare(5,3); // 比较对象大小
System.out.println(compare2); // 后一个数小 -> 1
}
```
运行效果:
![2.运行结果](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/1f46645e51d246df945a01d8941c821b~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=306&h=98&s=4231&e=png&b=282a36)
3. 数据类型可以省略, 由编译器推断得出, 称为"类型判断"
```java
@Test
public void test03(){
Consumer
@Override
public void accept(String s) {
System.out.println("hey man nice to meet you "+s);
}
};
con1.accept("none"); // 调用方法
Consumer
System.out.println(s);
};
con2.accept("nice to meet you, bro");
Consumer
// 当然这里可以运用方法引用 System.out::println;
System.out.println(s);
};
con3.accept("nice to meet you");
}
```
运行效果:
![3.运行效果](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/5bfc14d6472c44cebcfddc7c41881f65~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=354&h=106&s=7311&e=png&b=282a36)
4. 若函数需要一个参数时, 其小括号可以省略
5. lambda需要≥2个参数, 执行多条语句, 并且可以有返回值
```java
@Test
public void test5(){
Comparator
@Override
public int compare(Integer o1, Integer o2) {
System.out.println(o1);
System.out.println(o2);
return o1.compareTo(o2);
}
};
System.out.println(com1.compare(12,22)); // 前面小 会输出 -1
System.out.println("=========================");
Comparator
System.out.println(o1);
System.out.println(o2);
return o1.compareTo(o2);
};
System.out.println(com2.compare(22,11)); // 方法调用, 后面小, 会输出 1
}
```
运行效果:
![5.输出结果](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/09b8876f273241c7bb3b9875fce41bfd~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=365&h=211&s=5987&e=png&b=282a36)
6. lambda体只有一条语句时, return 与 {} 若有, 可以省略
```java
@Test
public void test6(){
Comparator
return o1.compareTo(o2);
};
System.out.println(com1.compare(12,4));
System.out.println("=====================");
Comparator
System.out.println(com2.compare(4,21));
}
```
运行效果:
![6.执行效果](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/acbe975ce2024e1db562004e3defedbd~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=350&h=107&s=4594&e=png&b=272935)
## JUnit单元测试的使用
1. 需要导入的jar包 [下载地址](https://jar-download.com/artifacts/junit/junit)
![导入jar包](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/8dcf6bbabdc94e50852d2019e88e4ed7~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=194&h=63&s=1950&e=png&b=ffffff)
2. 导入 (IDEA的话就通过 File -> Project Structure -> Libraries-> 按下`+` Java, 选择对应的文件夹, 需包含上面两个 jar 包) 然后·在Modules里对应的地方打勾即可
![导入步骤](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/6c4f83767e0c473f9c707dbb0c8903d7~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=1063&h=192&s=15339&e=png&b=414450)
3. 创建单元测试类, 进行测试 (可以不使用main函数的情况下 测试某一部分代码的功能) 测试的注解一般是 @Test
![@Test](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/8bac7967702d459ba7ba716c9cfe596d~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=218&h=89&s=4721&e=png&b=2e313e)
4. 编写单元测试方法