为什么使用下划线使这个列表理解只打印一个点?

时间:2013-11-21 15:36:38

标签: scala

在Scala 2.9.2中

List(List(1,5,4),List(7,9,11)).flatten.map {i => println(i); identity(i) }.find { _ % 2 == 0 }

打印:

1
5
4
7
9
11
Option[Int] = Some(4)

但是

List(List(1,5,4),List(7,9,11)).flatten.map { println("."); identity(_) }.find { _ % 2 == 0 }

打印

.
Option[Int] = Some(4)

我必须承认,我对这种行为感到有些惊讶。 Underscore似乎不仅仅是等效内联函数的简写,而是对代码有其他影响。这是怎么回事?

1 个答案:

答案 0 :(得分:7)

{ println("."); identity(_) }

不是打印点并返回标识的函数。这是一个代码块,在计算表达式时执行一次,打印一个点,然后返回函数identity(_),然后映射到展平列表上。