我该如何与if进行for循环并取得良好的返回类型

时间:2019-04-03 19:20:57

标签: scala apache-spark for-loop

我想解决问题,

我已经完成了这段代码,并获得了输出

found   : Unit
[error]  required: Boolean
[error]       for (data <- category(i)) {

我必须返回:(List[String], (List[String], (List[String])

我选择使用filter方法来实现紧凑的代码。 我不明白为什么它不起作用。为什么代码不返回布尔值而是单位。

如果列表中至少有1个元素以x开头,我希望此方法返回true,否则该方法必须返回false。

谢谢

def classifiedColumns(columnNames: List[String]): (List[Column], List[Column], List[Column]) = {
    val category = List(
      List("t01", "t03", "t11", "t1801", "t1803"), // 1
      List("t05", "t1805"), // 2
      List("t02", "t04", "t06", "t07", "t08", "t09", "t10", "t12", "t13", "t14", "t15", "t16", "t18")) // 3

    def get_info(x: String, i: Int, category: List[List[String]]): Boolean = {
      for (data <- category(i)) {
        if (data.startsWith(x)) true
        else false
      }
    }

    (columnNames.filter(x => get_info(x, 1, category)).map(column),
      columnNames.filter(x => get_info(x, 2, category)).map(column),
      columnNames.filter(x => get_info(x, 3,  category)).map(column))
  }

classifiedColumns(List("t0201", "t0408", "t0600084"))

1 个答案:

答案 0 :(得分:2)

您使用for的行为与预期不符。您正在使用这种理解:

for (data <- category(i)) {
  if (data.startsWith(x)) true
  else false
}

此表达式“减法”为(即简写):

category(i).foreach(data => {
  if (data.startsWith(x)) true
  else false
})

foreach返回Unit,因此此表达式的类型(以及从您的get_info方法返回的类型,这是方法的主体)为Unit

目前尚不清楚您希望在这里返回什么,我假设您要让方法返回true,如果category(i)中元素的 any 以{{ 1}}。如果是这样,您可以按以下步骤实现它:

x

按预期返回哪个category(i).exists(_.startsWith(x))