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

我是在Android开发中使用RetroLamda的新手。据我所知,选择方法取决于参数类型。我有如下界面:

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