学习笔记
在 Java 和 Android 中,除了你提到的 setOnClickListener() 使用 Lambda 表达式和匿名类的写法,还有许多类似的场景可以通过 Lambda 表达式来简化代码。以下是一些常见的类似用法以及它们如何通过 Lambda 表达式和匿名类实现。
1. setOnClickListener 和 View.OnClickListener
你已经提到的 setOnClickListener 是一个典型的例子。这里的 View.OnClickListener 接口只有一个 onClick(View v) 方法。
匿名类(传统方式):
button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 处理点击事件}
});
Lambda 表达式:
button.setOnClickListener(v -> {// 处理点击事件
});
2. setOnItemClickListener 和 AdapterView.OnItemClickListener
在 ListView 或 GridView 中,我们常常会用到 setOnItemClickListener 来设置项目点击事件监听器。
匿名类(传统方式):
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {// 处理项目点击事件}
});
Lambda 表达式:
listView.setOnItemClickListener((parent, view, position, id) -> {// 处理项目点击事件
});
3. setTextChangedListener 和 TextWatcher
TextWatcher 监听文本框内容变化,通常用于 EditText 等输入框。 匿名类(传统方式):
editText.addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {// 文本变化前}@Overridepublic void onTextChanged(CharSequence charSequence, int start, int before, int count) {// 文本变化中}@Overridepublic void afterTextChanged(Editable editable) {// 文本变化后}
});
Lambda 表达式(使用默认方法和接口):
如果我们不需要实现所有的方法,可以通过 Lambda 表达式简化:
editText.addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {// 实现前置操作}
});
如果某些方法不需要实现,可以选择重写只有一个方法的接口。 但对于 TextWatcher 这种需要重写多个方法的接口,Lambda 表达式的简化效果较小。
4. setOnCheckedChangeListener 和 CompoundButton.OnCheckedChangeListener
常用于 CheckBox、RadioButton 等组件来监听勾选状态的变化。
匿名类(传统方式):
checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {// 处理勾选变化}
});
Lambda 表达式:
checkBox.setOnCheckedChangeListener((buttonView, isChecked) -> {// 处理勾选变化
});
5. setOnLongClickListener 和 View.OnLongClickListener
常用于设置长按事件的监听器。
匿名类(传统方式):
view.setOnLongClickListener(new View.OnLongClickListener() {@Overridepublic boolean onLongClick(View v) {// 处理长按事件return true;}
});
Lambda 表达式:
view.setOnLongClickListener(v -> {// 处理长按事件return true;
});
6. addTextChangedListener 和 TextWatcher
监听文本框文本变化的过程,通常用于 EditText。 匿名类(传统方式):
editText.addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {// Text changed}@Overridepublic void onTextChanged(CharSequence charSequence, int start, int before, int count) {// Text changed}@Overridepublic void afterTextChanged(Editable editable) {// Text changed}
});
Lambda 表达式(简化):
editText.addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {// Text changed}
});
7. setOnTouchListener 和 View.OnTouchListener
如果你需要捕捉视图的触摸事件,可以使用 setOnTouchListener。
匿名类(传统方式):
view.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {// 处理触摸事件return false;}
});
Lambda 表达式:
view.setOnTouchListener((v, event) -> {// 处理触摸事件return false;
});
---
8. setOnItemSelectedListener 和 AdapterView.OnItemSelectedListener
这是 Spinner、GridView 等控件中常用的接口,用于监听项的选择事件。 匿名类(传统方式):
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {@Overridepublic void onItemSelected(AdapterView<?> parent, View view, int position, long id) {// 处理项选择事件}@Overridepublic void onNothingSelected(AdapterView<?> parent) {// 处理没有项选择事件}
});
Lambda 表达式:
spinner.setOnItemSelectedListener((parent, view, position, id) -> {// 处理项选择事件
});
总结
Lambda 表达式在 Java 8 中的引入使得代码更加简洁,尤其是在 Android 中使用监听器(如 OnClickListener、OnCheckedChangeListener 等)时,能够减少冗长的匿名类代码,提高代码的可读性。匿名类依然是兼容所有 Android 版本的通用写法,但如果你的应用运行在支持 Java 8 的设备上,使用 Lambda 表达式是推荐的方式。
常见的适用 Lambda 表达式的场景包括:
- OnClickListener
- OnItemClickListener
- OnCheckedChangeListener
- OnLongClickListener
- OnTouchListener
- TextWatcher
- OnItemSelectedListener
通过使用 Lambda 表达式,可以使得代码更简洁、易于维护。