Как я могу сделать цикл for с if else и сделать хороший тип возврата - PullRequest
0 голосов
/ 03 апреля 2019

Я хотел бы решить проблему,

Я сделал этот код, и у меня есть этот вывод

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

я должен вернуться: (List[String], (List[String], (List[String])

Я решил использовать метод фильтра для реализации компактного кода. Я не понимаю, почему это не работает. Почему код возвращает не bool, а Unit.

Я бы хотел, чтобы этот метод возвращал значение true, если хотя бы один элемент списка начинается с x, в противном случае метод должен возвращать значение 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 Ответ

3 голосов
/ 03 апреля 2019

Ваше использование for не ведет себя так, как вы ожидаете.Вы используете это для-понимания:

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

Это выражение "desugars" в (то есть сокращение для):

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

foreach возвращает Unit, и, следовательно,тип этого выражения (и тип, возвращаемый из вашего get_info метода, который является телом метода) равен Unit.

Непонятно, что вы ожидаете здесь вернуть, я предполагаю, что вы хотите, чтобы метод возвращал true, если любой элементов в category(i) начинается с x.Если это так, вы можете реализовать его следующим образом:

category(i).exists(_.startsWith(x))

, который возвращает Boolean, как и ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...