Groovy Tip 31 Map拾遗

                               Groovy Tip 31 Map拾遗

 

 

在Groovy语言中,Map类有了跟Java语言中的Map类的很大不同,这种不同导致了Groovy语言的Map类比起Java语言的Map相当简单,这些简单之处曾在很多地方提及。除此之外,Groovy语言的Map类还有一些值得注意的地方,要想熟练的使用Groovy语言的Map类对象,我们必须注意这些地方。

首先,当key为字符串时,该字符串是否加引号的效果一样。

如下面的语句:

 

      println (['a':1]==[a:1])

 

结果为:

true

 

同样,下面的语句:

 

      def map = ['a':1]

     

      println map.'a'

     

      println map.a

 

 

结果为:

1

1

 

这就导致了一个问题:如果key是一个变量呢?

 

      def  b = 'c'

     

      def m = [(b):3]

     

      println m."${b}"

 

 

可以看到,如果key是一个变量的话,可以使用小括号加变量名的表示法,如上面的"(b)"。

从上面的例子还可以看出,对于取值操作符"."来说,它的key都是字符串,无论key是否是否加上引号。如map.'a'和map.a都是用来取key值为"a"的值。如果key值的类型是非字符串类型,那么该如何取值呢?

 

      def m1 = [1:'a']

     

      println m1[1]

   

 

对于Map对象的取值来说,Groovy语言也有一项比Java语言方便的地方,就是可以给取值语句赋默认值。即get(key,default),它的返回值为:如果Map对象中存在key值,则返回key值对应的value;如果Map对象中不存在key值,则返回default值。

 

      def map = [a:1,b:2,c:3]

     

      println map.get('a',0)

     

      println map.get('d',0)

   

 

上面语句的结果为:

1

0

 

取值语句还有一点需要注意,当key值字符串中有"."时,就不能使用下面的取值语句:

 

      def map = ['a.b':1]

     

      println map.a.b

 

 

而要使用下面的取值语句:

 

      println map.'a.b'

 

 

那么语句"map.a.b"又表示什么意思呢?

 

      def m1 = [b:2]

     

      def m2 = [a:m1]

     

      println m2.a.b

 

 

上面的语句就能正常执行,当然,如果"m1"是一个GroovyBean对象,而"b"是该对象的一个属性,那么上面的取值语句也是可以正常执行的。

如果Map对象的value为闭包对象时,有文献说下面的语句会报错:

 

      def map = [a:{println 'a'}]

     

      map.a()

 

 

而我们可以测试一下,却发现上面的语句是可以正常执行的。当然,下面的语句也是可以正常执行的:

 

      (map.a)()

 

 

 

<think>嗯,用户想了解如何在Groovy中遍历Map结构。我先回忆一下GroovyMap遍历方法。记得Groovy提供了几种不同的方式,比如each方法、eachWithIndex,还有find和findAll这些方法。需要把这些方法整理清楚,并给出示例代码。 首先,用户可能最常用的就是each方法,可以遍历键值对。例如使用each闭包,里面可以接收两个参数或者一个Map.Entry对象。比如map.each { key, value -> ... }或者map.each { entry -> ... }。这时候需要给出代码示例,像引用里的例子那样。 然后,eachWithIndex方法可能也是用户需要的,可以同时获取索引、键和值。这时候示例需要展示如何同时使用这三个参数,比如索引从0开始,每遍历一个元素,索引递增。 接下来,find和findAll方法用于查找特定条件的元素。find返回第一个符合条件的键值对,而findAll返回所有符合条件的。需要说明它们的区别,并举例说明,比如查找键为'J'的条目或者值包含'Java'的情况。 另外,用户可能还关心如何获取键或值的集合,这时候可以用*.展开操作符,像map*.key或者map*.value,这可以将所有键或值提取成一个列表。例如引用中的例子,使用list = map*.getKey()来获取所有键。 还要注意代码格式的正确性,确保所有行内代码用$...$,独立代码块用三个反引号包裹,并标明语言类型。同时检查LaTeX语法是否正确,不过这里可能用到的数学表达式不多,主要是在需要的地方正确应用格式。 用户的问题可能还涉及性能或应用场景,但当前问题集中在遍历方法上,所以需要聚焦于不同的遍历方式和示例。需要引用提供的参考资料中的示例代码,比如引用1中的each方法,引用3中的find方法,以及引用2中的展开操作符。 最后,生成相关问题时要考虑用户可能的后续疑问,比如遍历时的性能优化、其他操作符的使用,或者如何结合条件筛选数据。确保问题相关且有引导性,帮助用户深入学习GroovyMap操作。</think>### Groovy遍历Map结构详解 在Groovy中,遍历Map集合可以通过多种方式实现,主要依赖内置的遍历方法和操作符。以下是具体实现方法及代码示例: --- #### 1. **使用`each`方法遍历** 通过`each`方法可以遍历Map的每一个键值对,支持两种参数格式: ```groovy def map = [J:"Java", K:"Kotlin", G:"Groovy"] // 方式1:直接接收键值对参数 map.each { key, value -> println "$key = $value" } // 方式2:通过Map.Entry对象访问 map.each { entry -> println "${entry.key} -> ${entry.value}" } ``` 输出: ``` J = Java K = Kotlin G = Groovy ``` 此方法适用于简单的遍历操作[^1]。 --- #### 2. **使用`eachWithIndex`遍历** 如果需要同时获取索引、键和值,可以使用`eachWithIndex`: ```groovy map.eachWithIndex { entry, index -> println "第${index+1}项:${entry.key} -> ${entry.value}" } ``` 输出: ``` 第1项:J -> Java 第2项:K -> Kotlin 第3项:G -> Groovy ``` --- #### 3. **使用`find`方法筛选特定条目** `find`方法返回第一个满足条件的键值对: ```groovy def result = map.find { key, value -> key == "J" || value.contains("Java") } println "找到的条目:${result.key} = ${result.value}" ``` 输出: ``` 找到的条目:J = Java ``` 此方法适用于查找单个符合条件的元素[^3]。 --- #### 4. **使用`findAll`方法筛选所有符合条件条目** `findAll`返回所有满足条件的键值对: ```groovy def results = map.findAll { key, value -> key.size() == 1 || value.startsWith("G") } println results ``` 输出: ``` [J:Java, K:Kotlin, G:Groovy] ``` --- #### 5. **通过操作符提取键或值集合** 使用`*.`展开操作符可快速获取键或值的集合: ```groovy def keys = map*.key // 等效于 map.collect { it.key } def values = map*.value println "所有键:$keys" println "所有值:$values" ``` 输出: ``` 所有键:[J, K, G] 所有值:[Java, Kotlin, Groovy] ``` 此操作符简化了对键值对的批量操作[^2]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值