地图功能条件

时间:2015-04-03 04:34:21

标签: scala apache-spark spark-streaming map-function

Scala中有什么内容,

condition ? first_expression : second_expression;

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

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

如果无法使用内联函数,如何在map中编写条件?

2 个答案:

答案 0 :(得分:31)

在Scala中,?运算符(有时称为三元运算符)不是必需的,因为它被常规if-else表达式包含在内:

val x = if (condition) 1 else 2

要在map中使用此功能,您可以使用flatMap,然后在Option的任意一侧返回if-else。由于Option可隐式转换为Iterable,因此效果是列表展平,Nones已过滤:

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

这相当于使用map然后使用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
}

您还可以使用filtermap

分两步执行此操作
val statuses = tweets.filterNot(_.isTruncate).map(_.getText)

这里的缺点是,这将在列表上重复两次,这可能是不合需要的。如果使用view,则可以使用相同的逻辑,只迭代列表一次:

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

答案 1 :(得分:2)

您可以过滤,然后映射,

  val statuses = tweets.filter(_.isTruncate).map(status=> status.getText())