微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

【Groovy】List对象的transpose和inject方法的使用

transpose()方法实际上就是数学中矩阵的转置,简单的来说就是行和列的交换: 

assert [[1,4],[2,5],[3,6]] == [list1,list2].transpose() 

transpose()不止可以用于两个List,还能用于多个List。譬如,我们有第三个List: 

def list3 = [7,8,9]

我们可以这样检查是否满足“list3 > list2 > list1”(每个对应的元素): 

assert [list1,list2,list3].transpose().every { a,b,c ->
    a < b && b < c
}
assert [[1,4,7],5,8],6,9]] == [list1,list3].transpose()

有一点需要注意的是,如果List的长度不一,则取最短的长度: 

def list4 = [1,1,1]
def list5 = [2,2]
assert [[1,2],[1,2]] == [list4,list5].transpose()

inject()方法遍历集合,第一次将传递的值和集合项目传给闭包,将处理结果作为传递的值,和下一个集合项目传给闭包,依此类推

def list = [1,2,3]
result = list.inject(0){s,l -> s += l }
assert 6 == result

def list = ['like','groovy']
result = list.inject('I'){s,l -> "$s $l" }
assert "I like groovy" == result

两个方法 结合使用举例,假设我们有两个List,分别是a和b,a和b的长度相同,现在我们想把a的每个元素作为key,b中对应的元素作为value,构造一个Map
def a = [1,3]
def b = [4,6]
def m = [a,b].transpose().inject([:]) { s,l -> s + [(l[0]): l[1]] }
assert m == [1: 4,2: 5,3: 6]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐