在日常开发中,处理ref="/tag/426/" style="color:#C468A7;font-weight:bold;">数据集合是家常便饭。比如你有一堆用户登录记录,只想找出最近一周活跃的用户;或者从一长串商品价格里挑出低于100元的特价商品。这时候,Scala 的 filter 函数就派上用场了。
什么是 filter?
filter 是 Scala 集合类中的一个高阶函数,它接收一个返回布尔值的条件函数,然后遍历集合中的每个元素,只保留满足条件的那些元素,生成一个新的集合。
它的基本语法很简单:
collection.filter(condition)
基础使用:筛选偶数
假设你有一个数字列表,想从中选出所有偶数:
val numbers = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val evenNumbers = numbers.filter(x => x % 2 == 0)
println(evenNumbers) // 输出:List(2, 4, 6, 8, 10)
这里 x => x % 2 == 0 就是一个判断是否为偶数的条件函数。
字符串筛选:找出长度大于3的单词
再来看个更贴近实际的场景。你在做文本分析,有一组单词,只想保留长度超过3个字符的:
val words = List("cat", "dog", "bird", "fish", "a")
val longWords = words.filter(word => word.length > 3)
println(longWords) // 输出:List(bird, fish)
对象过滤:筛选特定用户
实际项目中更多是处理对象。比如你有一个用户列表,每个用户有姓名和年龄:
case class User(name: String, age: Int)
val users = List(
User("Alice", 25),
User("Bob", 17),
User("Charlie", 30),
User("Diana", 16)
)
// 只保留成年人(假设18岁为成年)
val adults = users.filter(u => u.age >= 18)
println(adults) // 输出:List(User(Alice,25), User(Charlie,30))
这种写法在处理 API 返回的用户数据时特别实用,比如后台需要过滤出可参与活动的用户。
结合其他函数:先映射再过滤
filter 常和其他函数组合使用。比如你想从用户列表中提取成年用户的姓名:
val adultNames = users
.filter(_.age >= 18)
.map(_.name)
println(adultNames) // 输出:List(Alice, Charlie)
这种链式调用让代码既简洁又清晰,读起来就像在描述业务逻辑。
小技巧:使用占位符简化写法
如果参数只用一次,可以用下划线代替变量名:
val evenNums = numbers.filter(_ % 2 == 0)
val shortWords = words.filter(_.length < 4)
看起来更干净,适合简单判断。
在真实项目里,filter 不只是“筛选”这么简单。它帮你把杂乱的数据变整齐,让后续处理更高效。无论是前端显示调校时过滤日志,还是后端处理用户行为数据,掌握好 filter 能省不少事。