【问题标题】:How to replace lambda with a method reference for interface methods? [closed]如何用接口方法的方法引用替换 lambda? [关闭]
【发布时间】:2019-05-30 00:22:11
【问题描述】:

如何将 lambda 替换为接口方法中的方法引用?

public abstract interface Job
{
  public abstract String empName();

  public void JobWithDesc(String title)
  {
    setJobValueDesc(title, empName());
  }
}



public final class JobClient {

  private static final Job job;


  static {
    job = () -> ListJob.getName;
  }

  public static final Job getJob() {
    return job;
    }
}

想用引用替换这个 (job = () -> ListJob.getName;) lambda。请帮我解决这个问题

【问题讨论】:

  • 您的代码无法编译,不,您不能在不创建另一个方法的情况下将() -> "EmpApplication" 转换为方法引用。你可以创建一个这样的方法private static String getApplication() { return "EmpApplication"; } 然后你可以做job = JobClient::getApplication;
  • 您的abstract interface 没有意义。接口本质上是抽象的,只有使用default关键字才能提供方法实现。
  • ListJob 是什么ListJob::getName
  • @Aomine 其实可以参考interntoString 来实现
  • @Aomine String::toString 返回相同的字符串。所以你真的不需要创建自己的。

标签: java java-8


【解决方案1】:
job = "EmpApplication"::toString;

不过,问题是您为什么要将其转换为方法引用。

这是一个简单的 lambda,返回一个 String 字面量。没有方法被调用。

我们可以将"EmpApplication" 包装到一个静态方法中并引用它,或者使用一个返回自身的实例方法。

【讨论】:

  • @nullpointer 我认为 lambda 是正确的并且接口是正常的。不过,第二种方法的default 不见了
【解决方案2】:

你需要定义一个方法:

public static String getEmpApp() {
    return "EmpApplication";
}

并使用它:

static {
    job = JobClient::getEmpApp;
}

不过,我认为这样做没有任何意义。

也就是说,您的Job 接口存在编译错误。 JobWithDesc 方法应该是 staticdefault,它调用一个方法 - setJobValueDesc - 没有在任何地方定义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-26
    • 2018-12-14
    • 1970-01-01
    • 2019-05-11
    • 2014-10-25
    • 2018-10-03
    • 2019-06-21
    相关资源
    最近更新 更多