java - 有没有办法在方法参数中将 Java 代码片段作为 Groovy Closure 传递?

标签 java groovy

我目前正在将带有方法的遗留 Groovy 类翻译为 Java,对于大多数方法来说,只需稍作修改就可以轻松完成。 现在我陷入了一个以闭包作为参数的方法:

transformer.renameNumbers([:], { Number->
        return "${number.name}@somecompany.com"
    })
}

renameNumbers 实现是:

renameNumbers(Map<String,String> renameMap, someclosure = {it}) {
    numbers.each { it->

        if(newUsername == null ) {
            newNumbername = someclosure.call(it)
        }
        if(newNumbername!=null && newNumbername!=it.number) {
            def oldNumber= it.number
            it.number = newNumbername

            log.info("Changed numbername key of  from '$oldNumber' to '$newNumbername'")
        }
    }

问题是,如果我尝试简单地传递:transformer.renameNumbers(Map, Object)

它提示:

groovy.lang.MissingMethodException: No signature of method: org.eclipse.emf.ecore.util.EObjectContainmen.call() is applicable for argument types:

我猜这是因为我的普通 Java 对象没有 call() 方法。 有办法绕过这个吗?例如,如果我使用自定义调用方法创建自定义 Java 类?

谢谢

最佳答案

您可以尝试使用 Java 8 的功能接口(interface),例如 Function<T,R> 和 Lambda:

//Function<Number, String> f = (n) -> n.name + "@somecompany.com";
transformer.renameNumbers(new HashMap<>(), (n) -> n.name + "@somecompany.com");

用法:

void renameNumbers(Map<String, String> renameMap, Function<Number, String> somefunction) {
    numbers.forEach(it -> {
        String newNumbername = somefunction.apply(it); // <-----
        if (newNumbername != null && newNumbername != it.number) {
            String oldNumber = it.number; 
            it.number = newNumbername;
            log.info("Changed numbername key of  from '" + oldNumber + "' to '" + newNumbername + "'");
        }
    });
}

关于java - 有没有办法在方法参数中将 Java 代码片段作为 Groovy Closure 传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55184720/

相关文章:

java - 表 * 没有名为 ** 的列

eclipse - 如何在build.gradle中设置Eclipse项目的常规属性?

grails - Grails:为什么如果使用Ajax,则仅在刷新后呈现Flash消息?

tomcat - 本地主机 :8080 instead of :8080/appName? 上的 grails run-app

ruby-on-rails - Rails 还是 Grails?

java - 生成两种颜色之间的n种颜色

Java Future 与 C# async await

java - 海量多道程序和只读文件访问

java - 这两种在 Java 中初始化字段的方法有什么区别?

eclipse - 在 Eclipse 中编译 Groovy 文件