отображать слова, длина которых превышает 8 - PullRequest
0 голосов
/ 04 октября 2019

Я пытаюсь получить из списка ниже, где слова имеют r и размер должен быть больше 8 и преобразован в верхний регистр все значения в списке.

val names=List("sachinramesh","rahuldravid","viratkohli","mayank")

Но я пробовал с ниже, ноэто ничего не дает. Это ошибка выброса.

names.map(s =>s.toUpperCase.contains("r").size(8)

Это ошибка выброса. Может кто-нибудь сказать мне, как решить эту проблему.

С уважением, Кумар

Ответы [ 4 ]

3 голосов
/ 04 октября 2019

Если вы используете комбинацию filter и map, подумайте об использовании метода collect, который выполняет оба действия за один вызов. Вот как сделать то, что описано в вопросе:

names.collect{
  case s if s.lengthCompare(8) > 0 && s.contains('r') =>
    s.toUpperCase
}

collect работает как filter, поскольку возвращает только те значения, которые соответствуют выражению case. Он работает как map, потому что вы можете вносить изменения в совпадающие значения перед их возвратом.

2 голосов
/ 04 октября 2019

names.filter(...).map(...) подход решает проблему, однако требует итерации по списку дважды. Для более оптимального решения, когда мы просматриваем список только один раз, рассмотрим предложение @Tim относительно collect или, возможно, рассмотрим ленивый Iterator подход следующим образом:

names
  .iterator
  .filter(_.size > 8)
  .filter(_.contains('r'))
  .map(_.toUpperCase)
  .toList
2 голосов
/ 04 октября 2019

Вы можете попробовать это:

 names.filter(str => str.contains('r') && str.length > 8) // str contains an `r` and length > 8
    .map(_.toUpperCase) // map the result to uppercase
0 голосов
/ 04 октября 2019

Вы также можете попробовать это:

val result =for (x <- names if x.contains('r') && x.length > 8) yield x.toUpperCase
result.foreach(println)

ура

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