Groovy:从Map中筛选指定条件的Fizz对象存入Set
解决Groovy中筛选指定name的Fizz对象集合问题
嘿,这个需求在Groovy里处理起来超简单,得益于Groovy对集合操作的语法糖支持!下面给你几种直接有效的实现方式:
最简洁的原生实现方式
直接对allFizzes的所有值进行筛选,再转成你需要的Set类型:
// 方式1:用as Set转换类型 Set<Fizz> badFizzes = allFizzes.values().findAll { it.name == 'Sampson' } as Set // 方式2:用toSet()方法,可读性更强 Set<Fizz> badFizzes = allFizzes.values().findAll { it.name == 'Sampson' }.toSet()
代码解释
allFizzes.values():获取Map中所有的Fizz对象实例,返回一个Collection<Fizz>findAll { it.name == 'Sampson' }:Groovy集合的原生方法,传入闭包筛选出name字段等于'Sampson'的所有元素,返回List<Fizz>- 最后通过
as Set或toSet()把List转成Set类型,满足你需要的Set<Fizz>类型要求
额外说明
因为你的Fizz类使用了@Canonical注解,这个注解会自动帮你生成基于所有字段的equals()和hashCode()方法,所以把筛选后的对象放入Set时,不会出现重复元素(只有当两个Fizz的id和name完全相同时,才会被视为重复)。
如果你偏好Java Stream风格的写法(Groovy 3+支持),也可以这么写,但不如原生方式简洁:
import java.util.stream.Collectors Set<Fizz> badFizzes = allFizzes.values().stream() .filter { it.name == 'Sampson' } .collect(Collectors.toSet())
内容的提问来源于stack exchange,提问作者smeeb
相关产品推荐
相关产品推荐

