groovy(4)中switch

groovy(4)中switch,第1张

//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文件的静态变量等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9448583.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存