地图功能条件

Lis*_*isa 21 scala apache-spark spark-streaming map-function

Scala中有什么东西,

condition ? first_expression : second_expression;
Run Code Online (Sandbox Code Playgroud)

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

val statuses = tweets.map(status => status.isTruncate? //do nothing | status.getText())
Run Code Online (Sandbox Code Playgroud)

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

Ben*_*ich 35

?操作者,有时也被称为三元运算符是不Scala中必要的,因为它是由有规律归入if-else表达式:

val x = if (condition) 1 else 2
Run Code Online (Sandbox Code Playgroud)

要在a中使用它map,你可以使用flatMap然后Option在它的两边返回一个if-else.由于Option可以隐式转换为Iterable,因此效果是列表被展平,并且Nones被过滤:

val statuses = tweets.flatMap(status => if (status.isTruncate) None else Some(status.getText))
Run Code Online (Sandbox Code Playgroud)

这相当于使用map然后flatten:

val statuses = tweets.map(status => if (status.isTruncate) None else Some(status.getText)).flatten
Run Code Online (Sandbox Code Playgroud)

更惯用,可以使用collect,它允许你filtermap在一个步骤中使用的局部功能:

val statuses = tweets.collect {
    case status if !status.isTruncate => status.getText
}
Run Code Online (Sandbox Code Playgroud)

您还可以使用filter和执行以下两个步骤map:

val statuses = tweets.filterNot(_.isTruncate).map(_.getText)
Run Code Online (Sandbox Code Playgroud)

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

val statuses = tweets.view.filterNot(_.isTruncate).map(_.getText)
Run Code Online (Sandbox Code Playgroud)


S.K*_*hik 2

你可以过滤然后映射,

  val statuses = tweets.filter(_.isTruncate).map(status=> status.getText())
Run Code Online (Sandbox Code Playgroud)

  • 这不是解决问题的首选方法。导致过滤后的item被遍历两次;过滤器的所有项目都通过,然后第二次成功过滤的项目。考虑到过滤器保留的列表很大并且很大比例,您的解决方案效率也相当低。顺便说一句,Ben 的答案的最后一行使用的视图可以使您的解决方案变得高效。 (5认同)