【问题标题】:Create anonymous object with lambda expression [duplicate]使用 lambda 表达式创建匿名对象
【发布时间】:2021-03-30 17:50:47
【问题描述】:

我正在尝试使用 lamdas 简化我的对象创建。

我有一个提供public void addCmd(ScriptCommand cmd)-方法的类。

有了这个我可以写一个这样的调用:

ScriptCommand cmd = new ScriptCommand() {
                    @Override
                    public void run(double deltaTime) {
                      // some logic here...
                    }
                };
addCmd(cmd);

我已经尝试过这样调用:

ScriptCommand cmd = (deltaTime) -> {
                    // some logic here...
                };
addCmd(cmd);

但是,这被 IDE 识别为错误。 在这种情况下如何使用 lambda?

编辑:

ScriptCommand 看起来像这样:

public abstract class ScriptCommand {
    private boolean completed = false;

    public abstract void run(double deltaTime);

    protected void complete() {
        completed = true;
    }

    public boolean isCompleted() {
        return completed;
    }

}

【问题讨论】:

  • 什么是ScriptCommand?我的猜测是它不是一个功能接口。您只能使用函数式接口(只有一种方法的接口)编写 lambda,否则编译器将不知道您正在尝试实现哪种方法,并且您最终会得到未实现的方法。
  • @CharlieArmstrong: "(只有一种方法的接口)" ... 功能接口实际上可以有任意数量的方法声明(几个例如,Java 平台库中的功能接口添加了辅助方法)。但是,必须正确的规定是功能接口 - 必须 - 有一个(并且只有一个)抽象方法。
  • @scottb 好点,我应该说“只有一种 abstract 方法。”
  • 嘿 @CharlieArmstrong 和 scottb,我刚刚编辑了我的帖子并添加了 ScriptCommand.java 的结构。您能告诉我在最佳实践中我应该更改/添加哪些内容吗?
  • @MarcM 你不能让ScriptCommand 既是一个类又是一个接口。接口不能有字段(常量除外),因此如果您需要 completed 字段,您需要将其存储在另一个类中,或者坚持使用抽象类。

标签: java lambda


【解决方案1】:

例子:

@FunctionalInterface // Optional
interface ScriptCommand {
  void run(double deltaTime);
}

public static void main(String[] args) {
  ScriptCommand command = (deltaTime) -> System.out.println(deltaTime);
  // execute code
  command.run(3);
  // if you want to call addCmd(ScriptCommand)
  addCmd(command);
  addCmd((deltaTime) -> System.out.println(deltaTime));
}

输出:3.0

【讨论】:

  • 谢谢回复!我刚刚添加了我的 ScriptCommand 类结构,我认为这里的主要问题是,它不是一个接口,对吧?你能评论一下吗? :-)
  • 更新后,直接调用 addCmd((deltaTime) -> System.out.println(deltaTime));
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-25
  • 1970-01-01
  • 2019-06-01
  • 2013-07-16
相关资源
最近更新 更多