目录
Lambda 表达式
1. 为何需要 Lambda 表达式
- 在 Java 中, 我们无法发将函数作为参数传递给一个方法,也无法声明返回一个函数的方法
- 在 JavaScript 中,函数参数是一个函数,返回值是另一个函数的情况是非常常见的;JavaScript 是一门非常经典的函数式语言
2. Lambda 表达式作用
- Lambda 表达式为 Java 添加了缺失的函数式编程特性,使我们能将函数当作一等公民看待
- 在将函数作为一等公民的语言中,Lambda 表达式的类型是函数。但在 Java 中,Lambda 表达式是对象,他们必须依附于一类特别的对象类型 -- 函数式接口
3. Java Lambda 概要
Java Lambda 表达式是一种匿名函数;它是没有声明的方法,即没有访问修饰符、返回值声明和名字。
4. Lambda 表达式作用
传递行为,而不仅仅是值。
- 提升抽象层次
- API 重用性更好
- 更加灵活
5. Java Lamdba 基本语法
Java 中的 Lambda 表达式基本语法(左边是参数,右边是匿名函数的具体实现)
(argument) -> {body}
比如说
(arg1, arg2...) -> {body}
(type1 arg1, type2 arg2...) -> {body}
6. Java Lambda 示例
Lambda 示例说明
// 参数为 a,b ,返回 a+b
(int a, int b) -> {return a + b;}
// 无参数,打印 Hello World
() -> System.out.println("Hello World");
// 参数为 s,打印 s 值
(String s) -> {System.out.println(s);}
// 无参数,返回 42
() -> 42
// 无参数,返回 3.14
() -> {return 3.14}
8. Java Lambda 结构
- 当只有一个参数,且其类型可推导时,圆括号 () 可省略。例如:
a -> {return a*a}
lambda 的类型是由上下文信息来断定的
// lambda 的类型就是 String String s1 = () -> {};
- Lambda 表达式的主体可包含零条或多条语句
- 如果 Lambda 表达式的主体只有一条语句,花括号 {} 可省略,并且有
return
返回值的要去掉return
。匿名函数的返回类型与该主体表达式一致 - 如果 Lambda 表达式的主体包含一条以上语句,则表达式必须包含在花括号 {} 中(形成代码块)。匿名函数的返回类型与代码块的返回类型一致,若没有返回则为空。
大例子
一个完整的例子:遍历 list
外部迭代
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
for (int number: numbers) {
System.out.println(number);
}
内部迭代
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
numbers.forEach(new Consumer<Integer>(){
public void accept(Integer value) {
System.out.println(value);
}
})
使用 Lambda 表达式
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
numbers.forEach(Integer value) -> System.out.println(value);
更近一步
List<Integer> number = Arrays.asList(1, 2, 3, 4, 5, 6);
numbers.forEach(value -> System.out.println(value));
forEach 接口是函数式接口。
方法引用
List<Integer> number = Arrays.asList(1, 2, 3, 4, 5, 6);
// method reference
numbers.forEach(System.out::println);
通过方法引用的方式创建函数式接口的实例。
外部迭代和内部迭代区别:
外部迭代需要一个迭代器对象,内部迭代List本身就可以完成。
PS:
发现用 compareTo
方法结合 lambda 表达式来进行数组反转实在是太好用了,哈哈哈:
List<String> list = Arrays.asList("zhangsan", "lisi", "wangwu", "zhaoliu");
// 匿名内部类
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o2.compareTo(o1);
}
});
// lambda 表达式
Collections.sort(list, (o1, o2) -> o2.compareTo(o1));