groovy 定义数组方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了groovy 定义数组方法相关的知识,希望对你有一定的参考价值。

def AR_Interface=new AUTOSAR_Interface[2];
AR_Interface[0]=new AUTOSAR_Interface();
AR_Interface[1]=new AUTOSAR_Interface();

AUTOSAR_Interface是我自己定义的一个class。我需要先声明数组AR_Interface,然后再初始化,有没有简易的代码,可以让这两步同时完成,谢谢。

参考技术A 一、数组的定义及赋初值
在Groovy语言中,数组的定义和Java语言中一样。
def a = new String[4]

def nums = newint[10]

def objs = new Object[3]

然后赋值也一样:
a[0] = 'a'
a[1] = 'b'
a[2] = 'c'
a[3] = 'd'

所不同的在于在数组定义的时候赋初值。
在Java语言里,对一个字符串数组这样定义:
String[] strs = new String[]'a','b','c','d';

而在Groovy语言中,对一个字符串数组则需要这样定义:
def strs = ['a','b','c','d'] as String[]

二、数组的遍历
在Groovy语言中,对数组的遍历方法很多,常用的是使用each方法:
a.each

println it


当然,你也可以使用增强for循环:
for(it in a)

println it


你还可以使用如下的遍历方式:
(0..<a.length).each
println a[it]


三、数组和List之间的转化
List对象转化成数组对象非常简单:
List list = ['a','b','c','d']

def strs = list as String[]

println strs[0]

绝对没有Java语言那么复杂:
List list = new ArrayList();
list.add("1");
String[] strs = (String[])list.toArray(new String[0]);

System.out.println(strs[0]);

而从数组转化成List对象也非常简单:
def strs = ['a','b','c','d'] as String[]

List list = strs.toList()

println list.get(0)

你也可以这样转化:
def strs = ['a','b','c','d'] as String[]
List list = strs as List

println list.get(0)

而在Java语言中,你需要这样转化:

List list = Arrays.asList(strs)
参考技术B def AR_Interface=new AUTOSAR_Interface[2]new AUTOSAR_Interface(),new AUTOSAR_Interface();追问

如果数组是100个 或者1000个, 那怎么办。有没有简单的方法 除了循环。

追答

没办法,只要循环。

Groovy 反射字符串常量方法

Keywords: Groovy, Reflection, 反射

The Reflection of Groovy String constant style method.

 

Groovy支持以下的方法定义:

class A {
  def "I am a method"() {
  }
}

 

Groovy是继承Java的机制的,而Java显然是不支持这种函数定义命名的。然而实际上,你是用A.class.getMethods() 或 A.metaClass.getMethods() 都能获取到带空格的方法名,只是调用起来很麻烦,可能只能靠反射去invoke调用。所以一般这种写法主要用于TestSuite做单元测试或测试驱动开发。其实这个反射很简单,难的是下面的。

 

Spock是个很灵活的Java/Groovy的测试框架(Spock以后有空再介绍),基于JUnit。但是Spock中继承了Specfication的测试类的字符串常量方法,会在groovy compile的时候compile成一个名字类似$spock_feature_0_0 这样的名字,这时候想要找回原来的对应的常量就不是那么简单了。但既然JUnit能做到,我们就去看JUnit的run的源码,发现它会生成一个Sputnik的Runner,这是个Spock的类,其中它会有个private的SpecInfo的字段,里面包含了当前类的所有features。Spock把每个test method看作一个feature。

因此我只要new一个Sputnik,通过反射把SpecInfo中的信息拿出来,就能拿到按顺序所有排序的方法和对应编译后的方法名了了。

 public static List<String> getAllSpecFeatures(String className) {
        List<String> ret = new ArrayList<>();
        Class klass = Class.forName(className);
        Sputnik runner = new Sputnik(klass);
        Method m = runner.class.getDeclaredMethod("getSpec");
        m.setAccessible(true);
        SpecInfo specInfo = m.invoke(runner);
        List<FeatureInfo> featureInfos = specInfo.getFeatures();
        for (FeatureInfo featureInfo : featureInfos) {
            // original groovy method name
            ret.add(featureInfo.getName());
            
            // compiled method name, format like "$spock_feature_0_0"
            println(featureInfo.featureMethod.reflection.name)
        }
        return ret;
    }

 

以上是关于groovy 定义数组方法的主要内容,如果未能解决你的问题,请参考以下文章

groovy语言,将一个数组的元素去重之后,将元素数作为返回值,代码如何写?

thinkcmf七牛云怎么定义数组

javaScript中数组的定义方法

数组定义方法 数组遍历方法 全局变量和局部变量定义 赋值传值和赋值传址定义

数组,定义方法内容整理

数组的总结:数组简介定义数组赋值和使用常用方法等