groovy - 如何使用 @ClosureParams 来实现需要两个参数的闭包?

标签 groovy closures

我有一个以闭包作为其参数之一的方法,我希望使用 @ClosureParam 注释来转换输入闭包的参数:

def <T> List<T> randomInstances( final int size, final Builder<T> builder, 
                                 @ClosureParams( SecondParam.FirstGenericType ) 
                                  final Closure<Void> postProcessor = null ) {

        ( 0..<size ).collect {
            def instance = builder.build()
            if ( postProcessor ) {
                postProcessor( instance )
            }
            instance
        }
    }

现在,我添加了第二个方法,它可以执行相同的操作,但闭包将接收两个参数:

def <T> List<T> randomInstances( final List<?> listToIterate, 
                                 final Builder<T> builder,
                                 @ClosureParams( FirstParam.FirstGenericType ) 
                                 @ClosureParams( SecondParam.FirstGenericType ) 
                                 final Closure<Void> postProcessor = null )

我很确定两个 @ClosureParams 串联是错误的用例。但我还没有找到如何将两个闭包的参数“声明”传递给方法签名的方法。 是否可以??有人可以帮忙吗?

附注当我使用注释时,我不仅希望为 future 的读者进行描述,而且还可以帮助 IDEA 推断参数的类型。但我没有得到这个结果?我做错了什么,还是IDEA不支持这个功能??

最佳答案

在这种情况下,您可以使用 groovy.transform.stc.FromString使用 ["T,U", "T"] 选项:

@ClosureParams(value = groovy.transform.stc.FromString, options = ["T,U", "T"])

这是一个简短的示例:

class Lists {
  static <T,U> List<T> randomInstances(List<U> listToIterate, final Builder<T> builder, @ClosureParams(value = FromString, options = ["T,U", "T"]) final Closure<T> postProcessor = null) {
    (0..<listToIterate.size()).collect {
      def instance = builder.build()
      if (postProcessor) {
        postProcessor(instance)
      }
      instance
    }
  }
}

对于给定的方法定义,IDE 参数建议如下所示:

enter image description here

enter image description here

关于groovy - 如何使用 @ClosureParams 来实现需要两个参数的闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51932440/

相关文章:

arrays - 如何比较两个数组包含相同的项目或不包含在 groovy 中?

java - Java 8 方法引用与 'real' 函数指针有何不同?

ios - 一旦异步调用在 swift 中出现,就停止它

ruby - 在 Ruby 中定义使用范围外变量的方法

android - 用于 AES 加密的 Gradle 脚本

java - Intellij Groovy 编译器抛出错误 Grabbing Grapes (download failed)

java - 将 Groovy 代码集成到预先存在的 Java 项目中时的 Groovy 陷阱

oop - 在Scheme中创建带有变量的环境

javascript - 对 JavaScript 闭包的工作原理感到困惑

list - Groovy中的List和List <String>是否相同?