我试图从下面的列表中获取单词,其中单词r和大小应大于8,并将列表中的所有值都转换为大写。
val names=List("sachinramesh","rahuldravid","viratkohli","mayank")
但是我在下面尝试过,但是它没有给出任何东西。抛出错误。
names.map(s =>s.toUpperCase.contains("r").size(8)
它抛出错误。 有人可以告诉我如何解决此问题。
关于, 库马尔
答案 0 :(得分:3)
如果您要同时使用filter
和map
,请考虑使用collect
方法,该方法一次调用即可完成。这是问题的处理方法:
names.collect{
case s if s.lengthCompare(8) > 0 && s.contains('r') =>
s.toUpperCase
}
collect
的工作原理类似于filter
,因为它仅返回与case
语句匹配的值。它的工作原理类似于map
,因为您可以在返回匹配值之前对其进行更改。
答案 1 :(得分:2)
您可以尝试以下方法:
names.filter(str => str.contains('r') && str.length > 8) // str contains an `r` and length > 8
.map(_.toUpperCase) // map the result to uppercase
答案 2 :(得分:2)
names.filter(...).map(...)
方法解决了该问题,但是需要遍历列表两次。对于仅遍历该列表一次的最佳解决方案,请考虑@Tim关于collect
的建议,或者考虑像这样的惰性Iterator
方法:
names
.iterator
.filter(_.size > 8)
.filter(_.contains('r'))
.map(_.toUpperCase)
.toList
答案 3 :(得分:0)
您也可以尝试以下方法:
val result =for (x <- names if x.contains('r') && x.length > 8) yield x.toUpperCase
result.foreach(println)
欢呼