转载自:https://www.runoob.com/java/java8-lambda-expressions.html
****
**1. 什么是Lambda表达式**
Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
使用 Lambda 表达式可以使代码变的更加简洁紧凑。
<br/>
**2. Lambda表达式语法**
```
(parameters) -> expression
或
(parameters) ->{ statements; }
```
<br/>
**3. lambda表达式的重要特征**
* 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
* 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
* 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
* 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定表达式返回了一个数值。
**4. lambda表达式例子**
```java
public class Java8Tester1 {
public static void main(String[] args) {
Java8Tester1 tester1 = new Java8Tester1();
//类型声明
MathOperation add = (int a, int b) -> a + b;
//不用类型声明
MathOperation sub = (a, b) -> a - b;
//大括号中的返回语句
MathOperation multi = (a, b) -> {
return a * b;
};
//不使用大括号和返回语句
MathOperation division = (a, b) -> a / b;
//10 + 5 = 15
System.out.println("10 + 5 = " + tester1.operate(10, 5, add));
//10 - 5 = 5
System.out.println("10 - 5 = " + tester1.operate(10, 5, sub));
//10 x 5 = 50
System.out.println("10 x 5 = " + tester1.operate(10, 5, multi));
//10 / 5 = 2
System.out.println("10 / 5 = " + tester1.operate(10, 5, division));
//不用括号
GreetingService greetingService1 = message -> System.out.println(message);
//用括号
GreetingService greetingService2 = (message) -> System.out.println(message);
//Runoob
greetingService1.sayMessage("Runoob");
//Google
greetingService2.sayMessage("Google");
}
interface MathOperation {
int operation(int a, int b);
}
interface GreetingService {
void sayMessage(String message);
}
private int operate(int a, int b, MathOperation mathOperation) {
return mathOperation.operation(a, b);
}
}
```
<br/>
**5. 变量作用域**
```java
public class Java8Tester2 {
//1. 对于全局变量在lambda表达式中使用没有限制
final static String salutation1 = "Hello!";
private String salutation2 = "Hello!";
@Test
public void test01() {
//2. 如果局部变量被lambda表达式引用了,则相当于
// final String salutation3 = "Hello!"; 被 final 修改的变量是不能修改的
String salutation3 = "Hello!";
//3. 不能声明与lambda参数中同名的局部变量,否则编译报错
//String message = "messsage";
GreetingService greetingService = message -> {
//4. lambda表达式中只能引用局部变量,不能修改,否则编译报错
//salutation3 = "Hello";
String newMessage3 = salutation3 + message;
System.out.println(newMessage3);
};
//Hello! Tom.
greetingService.sayMessage(" Tom.");
//5. salutation3被lambda表达式引用了,这里修改编译报错,不允许修改,因为它是 final 了
//salutation3 = "Hello";
}
interface GreetingService {
void sayMessage(String message);
}
}
```
- 网络通信
- 网络协议
- 端口和套接字
- TCP网络程序
- UDP网络程序
- 多线程聊天室
- 多线程
- 线程相关概念
- 线程实现方式
- 中断线程
- 线程生命周期
- 线程优先级
- 优先级规则
- 案例演示
- 线程同步机制
- 线程同步机制
- synchronized关键字
- ReentrantLock类
- Condition类
- 监视器概念
- volatile关键字
- final变量
- 死锁
- 线程局部变量
- 读/写锁
- 原子类
- 阻塞队列
- 工作规则
- 案例演示
- 常用阻塞队列
- 线程安全集合
- 高效的映射/集/队列
- 并发集视图
- 写数组的拷贝
- Arrays类的并行数组算法
- 同步包装器
- Callable与Future
- 执行器
- 线程池
- 预定执行
- 控制任务组
- Fork-Join框架
- 同步器
- 同步器
- 信号量
- CountDownLatch类
- CyclicBarrier类
- Exchanger类
- SynchronousQueue类
- 线程与Swing
- Swing与线程问题
- 两个原则
- Swing工作线程
- 单一线程规则
- 文件IO
- File类
- 文件输入输出
- ZIP压缩文件
- 集合
- 集合框架
- 集合接口
- 集合实现类
- 线程安全集合
- 集合算法
- 迭代器
- 集合排序
- JDBC
- JDBC是什么
- JDBC-ODBC桥
- JDBC驱动程序类型
- JDBC常用类与接口
- 数据库操作
- 连接数据库
- 增/删/改/查/预处理
- 事务
- 批处理
- commons-dbutils工具
- 安全问题
- Jedis
- 使用Jedis操作Redis数据库
- JSON转换
- 使用连接池
- 案例
- 单例破坏
- 单例定义
- 单例实现方式
- 懒汉式实现单例
- 饿汉式实现单例
- 单例破坏
- 类的单例破坏
- 枚举的单例破坏
- 克隆
- 克隆是什么
- 浅克隆
- 深克隆
- 注解
- 注解是什么
- 三大注解
- 内置注解
- 元注解
- 自定义注解
- NIO
- 相关概念
- BIO/NIO/AIO
- 多线程编程
- 线程同步
- 线程通信
- NIO
- NIO三大核心组件
- NIO网络编程
- NIO文件读写
- AIO
- Java8新特性
- Lambda表达式
- 方法引用
- 函数式接口
- 默认方法
- 什么是默认方法
- 默认方法语法格式
- 多个同名的默认方法问题
- 静态默认方法
- 默认方法实例
- Stream
- Stream是什么
- Stream示例
- Optional容器
- 新的日期时间API
- Base64
- SPI
- SPI是什么
- SPI与API的区别
- 常见场景
- 使用SPI需遵循的约定
- SPI使用步骤