我尝试使用 retrolambda 在Android上使用lambda表达式。在下面的代码中,我需要添加接口的监听器:
public interface LoginUserInterface {
void onLoginSuccess(LoginResponseEntity login);
void onLoginFail(ServerResponse sr);
}
码
private void makeLoginRequest(LoginRequestEntity loginRequestEntity) {
new LoginUserService(loginRequestEntity)
.setListener(
login -> loginSuccess(login),
sr -> loginFail(sr))
.execute();
}
private void loginSuccess(LoginResponseEntity login) {
//TODO loginSuccess
}
private void loginFail(ServerResponse sr) {
//TODO loginFail
}
但Android Studio将红色 loginSuccess(登录)和 loginFail( sr )标记为错误
并显示消息" LoginResponseEntity无法应用于"和" ServerResponse无法应用于"
所以我不能设置lambda参数' 登录'作为方法的参数 loginSuccess(登录)
请帮助我理解这个表达的错误。
答案 0 :(得分:4)
您只能将{lambdas}与Functional interfaces一起使用。这意味着您的界面必须仅指定一个方法。
要记住它(简单地说 - 能够使用lambdas而不是匿名类),最好是将@FunctionalInterface
注释放到接口上。
@FunctionalInterface
public interface LoginUserInterface {
LoginResult login(...)
}
然后调度LoginResult
答案 1 :(得分:2)
是的,正确的答案是“你只能将lambda用于Functional接口。这意味着你的接口必须只指定一种方法。”
对于其他将搜索某些解决方法的人来说,这是我的解决方案: 两个功能接口上的Devide接口
public interface SuccessLoginUserInterface {
void onLoginSuccess(LoginResponseEntity login);
}
public interface FailLoginUserInterface {
void onLoginFail(ServerResponse sr);
}
你的lambda表达式看起来很好:
private void makeLoginRequest(LoginRequestEntity loginRequestEntity) {
new LoginUserService(loginRequestEntity)
.setsListener(
login -> loginSuccess(login),
sr -> loginFail(sr))
.execute();
}