如何让Scala自定义safeFiltersMap支持直接传入键值对参数?
实现方案
你可以通过**可变参数(varargs)**语法来实现这个需求,让函数支持直接传入多个键值对参数,具体步骤如下:
1. 调整函数结构
保留原有的尾递归过滤逻辑,新增一个接收可变键值对参数的入口方法:
// 对外暴露的方法,支持直接传入多个键值对 def safeFiltersMap(kv: (String, String)*): Map[String, String] = { // 将可变参数转为Map,调用原尾递归函数 safeFiltersMap(kv.toMap) } // 原尾递归过滤函数,改为私有避免外部直接调用 @tailrec private def safeFiltersMap( map: Map[String, String], accumulator: Map[String,String] = Map.empty): Map[String, String] = { if(map.isEmpty) accumulator else { val (key, value) = map.head safeFiltersMap( map.tail, if(value.nonEmpty) accumulator + (key->value) else accumulator ) } }
2. 语法说明
(kv: (String, String))*是Scala的可变参数语法,表示可以接收任意多个(String, String)类型的键值对,和原生Map的构造参数格式完全一致。- 调用
kv.toMap可以把可变参数列表直接转换为Map[String, String],再传递给原有的尾递归函数完成过滤逻辑。 - 把原尾递归函数标记为
private,可以避免外部直接调用,保证对外接口的简洁性。
3. 使用示例
现在你可以像原生Map那样直接传入键值对调用:
val safeMap1 = safeFiltersMap("a"->"b","c"->"d") // 输出: Map(a -> b, c -> d) val safeMap2 = safeFiltersMap("x"->"", "y"->"hello", "z"->"") // 输出: Map(y -> hello)
内容的提问来源于stack exchange,提问作者Shivam Sahil
相关产品推荐
相关产品推荐

