Lambde表达式干什么用的?
一种简写的格式, 类似于for循环和增强for循环关系,最直观的好处简写代码,以前要占四五行代码,现在可能只需要用一行代码就搞定了
ArrayList<String> list = new ArrayList<>();
//普通for 循环
for (int index = 0; index < list.size(); index++) {
......
}
//增强for 循环
for (String string : list) {
......
}
下面是示例代码 和详细解析
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//示例代码1:重写的方法不带参数
new Thread(new Runnable() {
@Override
public void run() {
Log.i(TAG, "run: ");
}
});
new Thread(() -> Log.i(TAG, "onCreate: "));
new Thread(() -> {Log.i(TAG, "onCreate: ");});
//示例代码2:重写的方法带一个参数
Button button = new Button(this);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i(TAG, "onClick: ");
}
});
button.setOnClickListener(v -> Log.i(TAG, "onCreate: "));
button.setOnClickListener((v) -> {Log.i(TAG, "onCreate: ");});
button.setOnClickListener((View v) -> {Log.i(TAG, "onCreate: ");});
//示例代码三:重写的方法带多个参数,并带有返回值
File file = new File("");
file.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String filename) {
return filename.endsWith(".png");
}
});
file.list((dir, filename) -> filename.endsWith(".png"));
file.list((File dir, String filename) -> {return filename.endsWith(".png");});
file.list((File dir, String filename) -> {
Log.i(TAG, "onCreate: ");
return filename.endsWith(".png");
});
}
Lambde表达式分两部内容: “->”的左侧和右侧
如下图:
“->”左边表达式,相当于重写方法里面的参数,有三种情况:
- 重写的方法没有参数时,用()表示;上面的实例代码1
- 有一个参数时,表示方式有下面三种:上面的实例代码2
- v :变量名;可以是任意自定义的,当然最好和类型、具体参数意义相关
- (v):括号包裹变量名;
- (View v):括号里面数据类型加上变量名
- 重写的方法里面有多个参数,表示方式:上面的实例代码3
- (dir, filename):括号包裹变量名,变量名可任意自定义,各个变量之间有逗号隔开
- (File dir, String filename):在上面的基础上给变量加上数据类型
“->”右边表达式,相当于自己重写方法里面的具体内容,有两种情况:
- 重写的方法表达式只有一句话时,分两种情况:
- 返回值为void:示例代码1
- Log.i(TAG, “onCreate: “):直接写上这句话,并省略分号;
- {Log.i(TAG, “onCreate: “);}:用大括号包裹,并且有语句结束符号分号
- 返回值为非void:示例代码3
- filename.endsWith(“.png”):直接写上这句话,并省略分号;
- {return filename.endsWith(“.png”);}:用大括号包裹,并且有语句结束符号分号,语句前面必须加上return关键字;
- 返回值为void:示例代码1
- 重写的方法表示式有多句话时:示例代码3
- {Log.i(TAG, “onCreate: “);return filename.endsWith(“.png”);}:大括号包裹多条语句,每句话都必须有结束符号分号;如果返回值类型为非void,必须有return结束语句;如果返回值为void,可以省略return 语句;
PS: Lambde表达式只支持重写一个方法的, 如果你重写的方法有多个, 不好意思, 不支持
问题来了,既然这么多表示方式,到底用那种呢?
快捷键提示就知道了, 应该是最简洁的: 如果左侧只有一个参数, 那么就可以省略小括号和参数类型; 如果右侧只有一句话, 就可以省略大括号和分号
Android Studio提示快捷键: 快捷键Ctrl + Shift + 空格
在Android Studio上面用法:
问题是Android Studio 2.1版本以前不支持Lambde表达式,解决办法:传送门 gradle-retrolambda