Android RetroLamda实现问题
我是在Android开发中使用RetroLamda的新手。据我所知,选择方法取决于参数类型。我有如下界面:Android RetroLamda实现问题,android,java-8,retrolambda,Android,Java 8,Retrolambda,我是在Android开发中使用RetroLamda的新手。据我所知,选择方法取决于参数类型。我有如下界面: interface OnCallListener { onSuccess(String msg); onError(String msg); } 现在共同实施: test.SetOnCallListener(new OncallListener(){ public void onSuccess(String msg){ ...... } public void o
interface OnCallListener {
onSuccess(String msg);
onError(String msg);
}
现在共同实施:
test.SetOnCallListener(new OncallListener(){
public void onSuccess(String msg){
......
}
public void onError(String msg){
.....
}
});
如何在RetroLamda表达式中处理两种方法具有相同输入类型的这种情况?简短回答: 您可以使用默认方法并将侦听器子类化为只负责一种类型的事件 长答案: 我给出的答案更适合于迁移具有类似特性的普通Java侦听器:具有多个抽象方法的接口的侦听器,偶尔这些侦听器也会包含不必要的样板文件,因为用户只对处理一个特定事件感兴趣,而不是一次处理所有事件 将它们与Retrolambda一起使用会带来一些您可能愿意或不愿意接受的权衡。更多关于这个和 基本思想:要使listener参数成为使用lambda实现的有效目标,必须确保不管listener目标类是什么,它都应该有并且只有一个抽象方法。 考虑到最初的等级:
public interface CallListener<T> {
void onSuccess(T result);
void onError(String errorMsg);
}
或者:
您可以创建一个具体的类,该类允许插入其方法的各种(可能可重用)实现,并具有实用程序工厂方法,其中除一个之外的所有事件侦听器都是通过空操作实现的:
public class CallListenerImpl<T> implements CallListener<T> {
private Consumer<T> success; // java.util.function.Consumer
private Consumer<String> error;
public CallListenerImpl(Consumer<? super T> succ, Consumer<String> err) {
success = succ; error = err;
}
void onSuccess(T result) {
success.accept(result);
}
void onError(String err) {
error.accept(err);
}
// Sugary stuffs:
public static <T> CallListenerImpl<T> success(Consumer<T> succ) {
return new CallListenerImpl<>(succ, noOp());
}
public static <T> CallListenerImpl<T> error(Consumer<String> err) {
return new CallListenerImpl<>(noOp(), err);
}
private static <T> Consumer<T> noOp() {
return a -> {};
}
}
公共类CallListenerImpl实现CallListener{
私有使用者成功;//java.util.function.Consumer
私人消费者错误;
公共电话听筒impl(消费者简短回答:
您可以使用默认方法并将侦听器子类化为只负责一种类型的事件
长答案:
我给出的答案更适合于迁移具有类似特性的普通Java侦听器:具有多个抽象方法的接口的侦听器,偶尔这些侦听器也会包含不必要的样板文件,因为用户只对处理一个特定事件感兴趣,而不是一次处理所有事件
将它们与Retrolambda一起使用会带来一些您可能愿意或不愿意接受的权衡。更多关于此和
基本思想:要使listener参数成为使用lambda实现的有效目标,必须确保不管listener目标类是什么,它都应该有并且只有一个抽象方法。
考虑到最初的等级:
public interface CallListener<T> {
void onSuccess(T result);
void onError(String errorMsg);
}
或者:
您可以创建一个具体的类,该类允许插入其方法的各种(可能可重用)实现,并具有实用程序工厂方法,其中除一个之外的所有事件侦听器都是通过空操作实现的:
public class CallListenerImpl<T> implements CallListener<T> {
private Consumer<T> success; // java.util.function.Consumer
private Consumer<String> error;
public CallListenerImpl(Consumer<? super T> succ, Consumer<String> err) {
success = succ; error = err;
}
void onSuccess(T result) {
success.accept(result);
}
void onError(String err) {
error.accept(err);
}
// Sugary stuffs:
public static <T> CallListenerImpl<T> success(Consumer<T> succ) {
return new CallListenerImpl<>(succ, noOp());
}
public static <T> CallListenerImpl<T> error(Consumer<String> err) {
return new CallListenerImpl<>(noOp(), err);
}
private static <T> Consumer<T> noOp() {
return a -> {};
}
}
公共类CallListenerImpl实现CallListener{
私有使用者成功;//java.util.function.Consumer
私人消费者错误;
公共调用列表程序impl(消费者这不是一个无效的lambda,因为它有多个抽象方法吗?我是否遗漏了关于retrolambda的内容?请现在检查问题,@M.prokhorovs这不是一个无效的lambda,因为它有多个抽象方法吗?我遗漏了关于retrolambda的内容吗?请检查问题,@M.Prokhorov