//groovy中switch 语句很强大,完全可以替换嵌套的if else
def x=123
def result
switch (x){
case 'foo':
result='found foo'
break;
case 'bar':
result='bar'
break
case [4,5,6,'inlist']://列表
result='list'
break
case 1230://范围
result='range'
break
case Integer://类型
result='Integer'
break
case BigDecimal:
result='big decimal'
break
default:result='default'
}
println(result)//big decimal
//groovy中for循环
def sum=0
//1:对Range范围的for循环
for(i in 09){
sum+=i
}
println(sum)//45
//2:对list的循环
for(i in[2,3,4,5,6]){
sum+=i
}
//3:对map循环
for(i in['li':1,"ch":2,"ao":3]){
sum+=ivalue
}
一、数组的定义及赋初值
在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方法:
aeach{
println it
}
当然,你也可以使用增强for循环:
for(it in a)
{
println it
}
你还可以使用如下的遍历方式:
(0<alength)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();
listadd("1");
String[] strs = (String[])listtoArray(new String[0]);
Systemoutprintln(strs[0]);
而从数组转化成List对象也非常简单:
def strs = ['a','b','c','d'] as String[]
List list = strstoList()
println listget(0)
你也可以这样转化:
def strs = ['a','b','c','d'] as String[]
List list = strs as List
println listget(0)
而在Java语言中,你需要这样转化:
List list = ArraysasList(strs)
都没有groovy目录,sourceSets应该不需要指定吧
,我最后参考了官网的groovy和java混合项目的目录路径,只要有groovy目录就可以了。不过还是遇到点小问题,在build的时候,如果java类引用groovy类,会编译失败,似乎编译的顺序是先java,后groovy,编译的时候引用不到groovy的类
proxy对象是不能序列化的,就算能序列化也不能反序列化,因为proxy对象的类是动态生成出来的,序列化后,反序列化时目标jVM肯定没有加载过这个代理类。
有个变通的方法,就是获取到对象本身,序列化;反序列化后获取到原对象,再重新用代理包装即可获得反序列化后的代理对象了。不知道是否贴题。下面有个例子,虽然没有序列化和反序列化,但是基本实现了获取对象本身这个功能,希望能帮到你。
另外groovy对象也是java对象,应该仍然保持groovy对象本身(个人理解,groovy我也是略懂皮毛),spring应该不会对对象本身动刀子,最多加层代理啥的。
//-------------------------------------------------------------------------------
import javalangreflectInvocationHandler;
import javalangreflectInvocationTargetException;
import javalangreflectMethod;
import javalangreflectProxy;
public class Test implements TestInterface{
public static void main(String[] args) {
final Test t = new Test();
TestInterface t2 = (TestInterface) ProxynewProxyInstance(
TestclassgetClassLoader(),
TestclassgetInterfaces(),
new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
try {
return methodinvoke(t, args);
} catch(InvocationTargetException ite) {
throw itegetTargetException();
}
}
}
);
t2test();
//使用这种方式获取原对象,序列化原对象后,反序列化原对象 重新构造代理
Systemoutprintln(t2getThis()getClass());
Systemoutprintln(t2getClass());
}
public void test() {
Systemoutprintln(1);
}
public Test getThis() {
return this;
}
}
interface TestInterface{
public void test() ;
public Test getThis() ;
}
Androidstudio使用groovyconsole命令的具体方法如下:进行打开Androidstudio的软件,进入到界面中,进行点击菜单中的“tools”的选项。就会d出了一个下拉的菜单的选项,进行选择下拉的菜单中的“Groovyconsole”的选项。在代码的窗口当中就会d出了一个窗口,进行选择一个为“app”的选项。然后就会在底部的位置中进行d出了一个Groovyconsole的命令的窗口。在Groovyconsole的命令的窗口中进行输入一条命令”systemoutprintln("小虾")“,然后进行点击左侧位置中的运行按钮。这样就会d出了执行的命令的结果中内容,要关闭Groovyconsole的命令的窗口,进行点击”关闭“按钮。就会d出了一个process”Groovyconsole“isRunning命令窗口确认框,进行点击discounect的按钮。
有时在其他语言中称为字典或关联数组,Groovy具有 Map 功能。
Map 将键与值相关联, 用冒号分隔键和值,使用逗号分隔每个键/值对,以及用方括号括起的整个键和值 。
当使用键的名称时,我们实际上在Map中定义了字符串键。Groovy创建的 map 实际上是 javautilLinkedHashMap 的实例。
如果 map 中不存在对应的键,则返回 null 。例如:
在上面的例子中,我们用了字符串类型的键,你也可以使用其他类型的值作为键:
在这里,我们使用数字作为键,因为数字可以明确地被识别为数字,因此Groovy不会像我们之前的例子那样创建字符串键。有种场景,你如果要传递一个变量代替键,让该变量的值成为键:
您还可以传递带引号的字符串以及键: ["name": "Guillaume"] 。您的字符串键必需是有效的标识符,例如您想创建一个包含哈希的字符串键,如: ["street-name": "Main street"] 。
当您需要 在 map 定义中将变量值作为键传递时,必须用括号括起变量或表达式 :
需求:jenkins使用中需要根据用户ID去显示生成环境参数,例如有一个 发布环境参数mode ,user1_develop和user2_develop只看到develop选项,user_dev只能看到dev选项,user_admin可以看到所有选项;
实现:mode参数使用 Active Choice Parameter 类型,Script 选择Groovy Script
import hudsonmodelUser
user=Usercurrent()
if( usergetId() indexOf("_develop") > -1){
return ["develop"]
}else if( usergetId() indexOf("_dev") > -1){
return ["dev"]
}else if( usergetId() indexOf("_admin") > -1){
return ["develop","dev","product"]
}
网友“水冰暖”的代码观点是对的,但是不能用contains方法,而是用equals方法比较好,因为你的object数组里面放的都是string类型,所以用equals方法可以判断是否相同。
网友“回复还要名字”的代码太片面,只是把list1中的第一个元素与list2里的第一个元素进行了 比较,然后把list1中的第二个元素和list2中的第二个元素比较了,如果你list1先addobj2,然后add obj1,那么他的方法是比较不出来的。
楼主的要求很容易实现,有若干种方法能够实现,只不过是需要取一个最优方法而已。我提供一个最容易理解但是比较消耗内存的方法的思路给楼主吧:
在for循环中嵌套一个for循环,在外面的循环中,取出list1中的第一个元素,然后在list2中分别取出每个元素与list1中的第一个元素进行比较,这叫遍历,然后一一比较。由于楼主的list中放的是obj数组,所以可能还需要第三个循环。如果有一次循环结束,而list1中的某个元素obj数组还是没有在list2中找到和自己完全一样的obj数组,那么,就可以断定,当前的obj数组就是list1与list2中不相同的元素了。
楼主追问如果在list2中add了obj5的话会找不到,请问楼主不是要找list1和list2中不一样的吗?list2里面有obj5,list1没有,那肯定list2里面的obj5也是不一样的,怎么找不到了呢?
以上就是关于groovy(4)中switch全部的内容,包括:groovy(4)中switch、groovy 定义数组方法、gradle(groovy)怎么读取java文件的静态变量等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)