本章目录
- Part One:Labmda表达式语法
- Part Two:Lambda表达式结构详解
- Part Three:Functional Interface
什么是Lambda表达式?先从我们最熟悉的按钮点击事件来看起,原先的写法是这样的:
按钮点击事件.png
注意到左边红框圈住的部分,点击收缩即可借助Android Studio自带的扩展功能转换为Lambda表达式形式:
按钮点击Lambda形式.png
Part One:Labmda表达式语法
从上图的例子可以看到,Lambda表达式将6行代码简化为1行代码。这样可以极大的减少代码冗余,同时可读性也好过冗长的内部类,匿名类。
其语法形式为:
//省略参数类型
(arg1, arg2, ...) -> {body}
//指定参数类型
(Type1 arg1, Type2 arg2, ...) -> {body}
lambda表达式中,参数的类型可省略。Java编译器根据表达式的上下文推导出参数的类型。
Part Two:Lambda表达式结构详解
- 参数可以是零个或多个
package cn.tmooc.tarena;
interface OneArgument{
void onClick(int x);
}
interface TwoArgument{
void onClick(int x, int y);
}
public class LambdaSimpleSample {
public static void main(String[] args) {
//零个参数
Runnable runnable = () -> System.out.println("零个参数");
//1个参数
OneArgument oneArgument = (x) -> System.out.println(x + 1);
//2个参数
TwoArgument twoArgument = (x, y) -> System.out.println(x + y);
}
}
- 参数类型可指定,可省略
package cn.tmooc.tarena;
interface OneArgument{
void onClick(int x);
}
public class LambdaSimpleSample {
public static void main(String[] args) {
//省略参数类型
OneArgument oneArgument1 = (y) -> System.out.println(y + 1);
//指定参数类型
OneArgument oneArgument2 = (int y) -> System.out.println(y + 1);
}
}
- 参数包含在圆括号中,用逗号分隔,参考2.1里面的2个参数的例子
- 表达式主体可以是零条或多条语句,包含在花括号中
package cn.tmooc.tarena;
interface OneArgument{
void onClick(int x);
}
public class LambdaSimpleSample {
public static void main(String[] args) {
//body是0条语句
OneArgument oneArgument1 = (y) -> {};
//body是多条语句
OneArgument oneArgument2 = (y) -> {
System.out.println(y + 1);
System.out.println(y + 2);
};
}
}
- 表达式主体只有一条语句时,花括号可省略,参考2.1的案例。个人感觉最好不要省略,养成一个习惯
- 表达式主体有一条以上语句时,表达式的返回类型与代码块的返回类型要匹配上
package cn.tmooc.tarena;
interface VoidInterface{
void onClick(int x);
}
interface IntInterface{
int onClick(int x);
}
public class LambdaSimpleSample {
public static void main(String[] args) {
//无返回值时
VoidInterface voidInterface = (y) -> {
System.out.println(y + 1);
y = y + 2;
};
//有返回值时,必须加return语句
IntInterface intInterface = (y) -> {
System.out.println(y + 1);
return y = y + 2;
};
}
}
Part Three:Functional Interface
在Part Two里面定义的接口,一直是这种形式的:
interface OneArgument{
void onClick(int x);
}
其中,该接口中只有一个方法。在Java 8中,这种接口称之为Functional Interface(函数式接口)。
以前我们都是习惯使用匿名内部类实现该接口,现在也用作Lambda表达式的类型。
常见的Functional Interface有Runnable,OnClickListener和Comparator。另外,Java 8也新增了很多函数式接口:
接口 | 参数 | 返回值 | 用途 |
---|---|---|---|
Predicate | T | boolean | 断言 |
Consumer | T | void | 消费 |
Function | T | R | 函数 |
Supplier | None | T | 工厂方法 |
UnaryOperator | T | T | 逻辑非 |
BinaryOperator | (T,T) | T | 二元操作 |
具体这些接口的用途等学完stream和方法引用另开单章细说。
网友评论