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,然后再初始化,有没有简易的代码,可以让这两步同时完成,谢谢。
在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语言,将一个数组的元素去重之后,将元素数作为返回值,代码如何写?