在Scala中这意味着什么foreach(_ =>())?

时间:2019-09-12 06:55:32

标签: scala

我在使用Monix流的代码中找到了这个foreach(_ => ()),但我不明白它的含义。有人可以给我解释一下吗?

monix_concurrent_subject.foreach(_ => ())

2 个答案:

答案 0 :(得分:7)

urmaul 在评论中解释,具体取决于:

  • 如果数据结构是急切的,它什么也不做。例如ListOption等。

  • 如果数据结构是惰性的,则会初始化其内容。一个示例是Stream

foreach也不返回任何内容,这意味着foreach之前的代码中某处将是副作用。

如果您检查API(ConcurrentSubject.html#foreach),则会显示:

  

foreachL(cb: (O) ⇒ Unit): Task[Unit]   创建一个新任务,该任务将消耗可观察的源,并为每个元素执行给定的回调。

答案 1 :(得分:3)

()表示类型为Unit the 值。它看起来可能很不寻常,但它仍然是真实的值,类似于42如何表示Int类型的值。例如,我们可以写

val u: Unit = ()

类似于

val i: Int = 42

()除了表明函数中出现了某些副作用以外,没有其他意义。

现在考虑以下类型为Int => Unit的功能

(x: Int) => ()

请注意,如何使用x右边的参数=>不执行任何操作,也就是说,根本不使用它。我们可以使用下划线_

明确表达这种含义。
(_: Int) => ()

甚至简单地

_ => ()

如果类型推断可以找出类型。在此函数上应用参数

((x: Int) => ())(42)

没有任何有趣的结果。因此,将这些部分放在一起,我们可能会得到以下_ => ()含义的解释:

  • 不起作用
  • 微不足道的效果
  • 无操作效果
  • 没有效果的效果

尽管_ => ()没有直接作用,如pme所述,当传递给foreach时,它可能有一些间接作用。

关于

monix_concurrent_subject.foreach(_ => ())

在我看来foreach(_ => ())在某种程度上更像是实现monix_concurrent_subject应该真正提供适当方法的东西。