【scala】: _* 如何将字符串作为包含多个字符串的参数

问题:使用scala时,对下划线的使用不明确,下划线有一种使用方式是 :_* 作为一个整体,告诉编译器你希望将某个参数当做参数序列处理。在这里,“参数序列”不懂,尝试做测试报错:
no `: _*’ annotation allowed here

经查找,以下文档经测试可理解。

引用:http://www.voidcn.com/article/p-kpzqbtrx-bxx.html

我的代码如下:

var args = "arg1,arg2" //come from external and also many e.g. arg3,arg4 ...
df.select(args.split(","):_*)

然后得到了错误:

:31: error: no `: *’ annotation allowed here (such
annotations are only allowed in arguments to *-parameters)
df.select(args.split(“,”):*)

任何人都可以提供帮助吗?谢谢.

嗯…只允许对期望变量参数的函数使用varargs语法(:_ *).

scala> def iAcceptVarArgs(strings: String*) = println(strings)
// iAcceptVarArgs: (strings: String*)Unit

scala> iAcceptVarArgs("str1", "str2")
// WrappedArray(str1, str2)

scala> iAcceptVarArgs(List("str1", "str2"): _*)
// List(str1, str2)

它不适用于不期望变量参数的函数,

scala> def iDoNotAcceptVarArgs(s: String) = println(List(s))
// iDoNotAcceptVarArgs: (s: String)Unit

scala> iDoNotAcceptVarArgs(List("str1"): _*)
// <console>:14: error: no `: _*' annotation allowed here
// (such annotations are only allowed in arguments to *-parameters)
//         iDoNotAcceptVarArgs(List("str1"): _*)
                                           ^

由于Dataframe.select具有以下签名,

def select(col: String, cols: String*): DataFrame

这意味着第一个参数是固定的,只有第二个参数可以是varargs

在这种情况下你应该使用模式匹配,


val args = "arg1,arg2"

val dfSelection = args.split(",").toList match {
  case a1 :: tail => df.select(a1, tail: _*)
  case Nil => df // well... what to do here ?
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我了解了你的问题。以下是Scala中定义一个Utils类,包含printNames方法的代码: ```scala class Utils { def printNames(names: String*): Unit = { if (names.nonEmpty) { println("打印不定字符串:") names.foreach(println) } else { println("未提供需要打印的字符串!") } } def printNames(numbers: Int, names: String*): Unit = { if (names.nonEmpty) { println(s"打印整数和不定字符串:$numbers") names.foreach(println) } else { println("未提供需要打印的字符串!") } } def printNames[T](names: Iterable[T]): Unit = { if (names.nonEmpty) { println("打印集合中的元素:") names.foreach(println) } else { println("未提供需要打印的元素!") } } def printNames(): Unit = { println("未提供任何参数,无法打印!") } } ``` 现在,我们定义了一个Utils类,包含了四个不同的printNames方法: - 接受不定字符串 - 接受一个整型和不定字符串 - 接受集合 - 不传递任何参数 你可以创建一个Utils类的实例,并调用其中的一个或多个printNames方法来打印接收到的参数。例如: ```scala val utils = new Utils utils.printNames("张三", "李四", "王五") // 输出: 打印不定字符串: // 张三 // 李四 // 王五 utils.printNames(123, "张三", "李四", "王五") // 输出: 打印整数和不定字符串:123 // 张三 // 李四 // 王五 utils.printNames(List("张三", "李四", "王五")) // 输出: 打印集合中的元素: // 张三 // 李四 // 王五 utils.printNames() // 输出: 未提供任何参数,无法打印! ``` 希望这个回答能够满足你的需求!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值