关于each方法

来源:4-13 映射详解(下)

全是甘货

2019-05-18

当你第一次使用each方法,里面的闭包参数写了:def student
1.此时这个student是不是等于it?
2.此时的student是不是就是each源码里面的那个Map类型的self?

写回答

2回答

RocketZly

2019-05-19

你这个问题其实点进源码查看方法就知道

//img.mukewang.com/szimg/5ce0c0d40001d4ec22860336.jpg

each其实只是一个语法糖,虽然我们写的时候看起来只传递了一个闭包的参数

//img.mukewang.com/szimg/5ce0c144000188e208640168.jpg

但你把生成的class反编译你就会看到,实际在java中是调用的DefaultGroovyMethods.each()然后这个方法需要传递两个参数,第一个是map,第二个是闭包

//img.mukewang.com/szimg/5ce0c182000111c218680084.jpg

那么回答你第二个问题self其实是传递进来的Map集合,跟闭包没有关系,接下来我们看你说的第一个问题,最终each方法会调用callClosureForMapEntry()方法

//img.mukewang.com/szimg/5ce0c28d0001983429460410.jpg

在方法里面可以看出对于闭包是支持单个参数和两个参数的,如果闭包是单个参数那么传递给闭包的就是map的entry对象,如果闭包是两个参数,那么就是map的key和value,然后又由于如果只是一个参数的时候是可以省略在闭包中的声明的,所以对于你第一个问题student是等于it,也就是map的entry对象

2
7
全是甘货
回复
RocketZly
这确实是一个很好的学习“秘诀”!再次向您学习!
2019-05-23
共7条回复

qndroid

2020-04-08

完美的回答!

0
0

Gradle3.0自动化项目构建技术精讲+企业级案例实操

全面覆盖Gradle核心知识和高级用法,高级工程师必备技能!

877 学习 · 144 问题

查看课程