我想对OnCheckedChangeListener使用lambda而不是匿名类。
用于设置侦听器的原始代码可以正常工作并读取:
mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
mCrime.setSolved(isChecked);
}
});
我尝试通过以下方式将其更改为lambda:
mCheckBox.setOnCheckedChangeListener(l -> mCrime.setSolved(isChecked));
但是我收到来自Android Studio的错误消息:选中了无法解析符号。
我曾想过,即使onCheckChanged接受两个参数,lambda也会隐式解析isChecked。我的理解有什么问题?
答案 0 :(得分:2)
您的语法错误。您所拥有的甚至都不应该编译。使用这个:
mCheckBox.setOnCheckedChangeListener((view, isChecked) -> mCrime.setSolved(isChecked));
->
之前的内容并不代表侦听器,而是代表在该侦听器中传递的参数,在这种情况下为View和boolean。
答案 1 :(得分:0)
setOnCheckedChangeListener
有两个参数
CompoundButton buttonView, boolean isChecked
,因此lambda语句应为
mCheckBox.setOnCheckedChangeListener(buttonView, isChecked -> mCrime.setSolved(isChecked))
话虽这么说,我对Java lambda并不十分了解,无法知道它是否可以处理多个参数。
答案 2 :(得分:0)
isChecked只是一个参数名称,当您使用lambda时不存在,但是这里是带有onCheckChangeListener参数名称的正确lambda
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="style/style.css">
<title>FileReader</title>
</head>
<body>
<h1>FileReader</h1>
<input type='file' accept='text/plain' onchange='openFile(event)'><br>
Input: <input type="text" id="qi" value="">
<br></br>
<button onclick="check()" class="button buttonB">Check</button>
<p id="ans"></p>
<p id=".same"></p>
<script src="main.js"></script>
</body>
</html>
function check(){
var text = document.getElementById("qi").value;
console.log(`Text: ${text}`);
var perf; //The value should be `file`
if (text === perf){
console.log("Same");
document.getElementById(".same").innerHTML = "Same";
} else{
console.log("Not Same!!!")
document.getElementById(".same").innerHTML = "Not Same!!!";
}
}
function openFile(event) {
var input = event.target;
var reader = new FileReader();
reader.onload = function(){
var file = reader.result;
console.log(file);
document.getElementById("ans").innerHTML = file;
};
reader.readAsText(input.files[0]);
};