【Groovy】集合遍历 ( 使用集合的 collect 循环遍历集合并根据指定闭包规则生成新集合 | 代码示例 )
【摘要】
文章目录
一、使用集合的 collect 循环遍历集合并根据指定闭包规则生成新集合二、代码示例
一、使用集合的 collect 循环遍历集合并根据指定闭包规则生成新集合
...
一、使用集合的 collect 循环遍历集合并根据指定闭包规则生成新集合
调用集合的 collect 方法进行遍历 , 与 调用 each 方法进行遍历 , 实现的功能是不同的 ;
collect 方法主要是 根据 一定的转换规则 , 将 现有的 集合 , 转换为一个新的集合 ;
新集合是 重新创建的集合 , 与原集合无关 ;
分析集合的 collect 方法 , 其传入的的参数是一个闭包 transform , 这是 新生成集合的规则 ;
在该函数中调用了 collect 重载函数 collect(self, new ArrayList<T>(self.size()), transform)
, 传入了新的 ArrayList 集合作为参数 , 该 新的 ArrayList 集合是新创建的集合 , 其大小等于被遍历的集合 ;
/**
* 使用<code>transform</code>闭包遍历此集合,将每个条目转换为新值
* 返回已转换值的列表。
* <pre class="groovyTestCase">assert [2,4,6] == [1,2,3].collect { it * 2 }</pre>
*
* @param self 一个集合
* @param transform 用于转换集合中每个项的闭包
* @return 转换值的列表
* @since 1.0
*/
public static <S,T> List<T> collect(Collection<S> self, @ClosureParams(FirstParam.FirstGenericType.class) Closure<T> transform) {
return (List<T>) collect(self, new ArrayList<T>(self.size()), transform);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
在 重载的 collect 方法中 , 为新创建的集合赋值 , 根据 transform 闭包逻辑 和 原集合的值 , 计算 新集合中对应位置元素的值 ;
/**
* 方法遍历此集合,将每个值转换为新值 <code>transform</code> 闭包
* 并将其添加到所提供的 <code>collector</code> 中.
* <pre class="groovyTestCase">assert [1,2,3] as HashSet == [2,4,5,6].collect(new HashSet()) { (int)(it / 2) }</pre>
*
* @param self 一个集合
* @param collector 将转换值添加到其中的集合
* @param transform 用于转换集合中的每一项的闭包
* @return 将所有转换后的值添加到其上的收集器
* @since 1.0
*/
public static <T,E> Collection<T> collect(Collection<E> self, Collection<T> collector, @ClosureParams(FirstParam.FirstGenericType.class) Closure<? extends T> transform) {
for (Object item : self) {
collector.add(transform.call(item));
if (transform.getDirective() == Closure.DONE) {
break;
}
}
return collector;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
二、代码示例
代码示例 :
class Test {
static void main(args) {
// 为 ArrayList 设置初始值
def list = ["1", "2", "3"]
// I. 使用 collate 遍历集合 , 返回一个新集合 , 集合的元素可以在闭包中计算得来
def list3 = list.collect{
// 字符串乘法就是将元素进行叠加
it * 2
}
// 打印 [1, 2, 3]
println list
// 打印 [11, 22, 33]
println list3
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
执行结果 :
[1, 2, 3]
[11, 22, 33]
- 1
- 2
文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。
原文链接:hanshuliang.blog.csdn.net/article/details/122081202
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)