26

Scala中有什么像,

condition ? first_expression : second_expression;

我可以在scala的map函数中使用吗?我希望能够写出这样的东西:

val statuses = tweets.map(status => status.isTruncate? //do nothing | status.getText())

如果内联函数是不可能的,我怎么能在里面写一个条件map

4

2 回答 2

44

?运算符,有时称为三元运算符,在 Scala 中不是必需的,因为它包含在正则if-else表达式中:

val x = if (condition) 1 else 2

要在 a 中使用它map,您可以使用flatMap然后Optionif-else. 由于Option可以隐式转换为Iterable,因此列表被展平,并且Nones被过滤:

val statuses = tweets.flatMap(status => if (status.isTruncate) None else Some(status.getText))

这相当于使用mapand then flatten

val statuses = tweets.map(status => if (status.isTruncate) None else Some(status.getText)).flatten

更惯用的是,您可以使用,collect它允许您在一个步骤中使用部分函数:filtermap

val statuses = tweets.collect {
    case status if !status.isTruncate => status.getText
}

filter您也可以使用and分两步执行此操作map

val statuses = tweets.filterNot(_.isTruncate).map(_.getText)

这里的缺点是这将遍历列表两次,这可能是不可取的。如果你使用view,你可以使用同样的逻辑并且只遍历列表一次:

val statuses = tweets.view.filterNot(_.isTruncate).map(_.getText)
于 2015-04-03T04:45:39.353 回答
2

你可以过滤然后映射,

  val statuses = tweets.filter(_.isTruncate).map(status=> status.getText())
于 2015-04-03T04:40:22.827 回答