我在找出下面代码中的差异时遇到了问题。
val l1 = List('a', 'b')
val l2 = List(1, 2, 3, 4)
val x = l1.flatMap(v1 => l2.map(b => "" + v1 + b))
print(x)
//List(a1, a2, a3, a4, b1, b2, b3, b4)
。
val l1 = List('a', 'b')
val l2 = List(1, 2, 3, 4)
val x = l1.flatMap(v1 => l2.map(_ => "" + v1 + _))
print(x)
//List(One$$$Lambda$13/398887205@1554909b, One$$$Lambda$13/398887205@6bf256fa, One$$$Lambda$13/398887205@6cd8737, One$$$Lambda$13/398887205@22f71333, One$$$Lambda$13/398887205@13969fbe, One$$$Lambda$13/398887205@6aaa5eb0, One$$$Lambda$13/398887205@3498ed, One$$$Lambda$13/398887205@1a407d53)
_
和b
的行为是否一样?
答案 0 :(得分:5)
使用下划线的b => "" + v1 + b
等同于"" + v1 + _
。
_ => "" + v1 + _
等效于_ => (b => "" + v1 + b)
或a => (b => "" + v1 + b)
。
答案 1 :(得分:3)
第二个版本代码正在创建部分应用的函数。这里_
只是告诉我们将来会有价值。
例如
scala> val x = l1.flatMap{ v1 =>
| l2.map(_ => "" + v1 + _)
| }
x: List[Any => String] = List($$Lambda$1150/1830704523@5401976b, $$Lambda$1150/1830704523@22f9cea5, $$Lambda$1150/1830704523@7fb2e8d3, $$Lambda$1150/1830704523@601f58a3, $$Lambda$1150/1830704523@387d2104, $$Lambda$1150/1830704523@541d5c48, $$Lambda$1150/1830704523@3c01d268, $$Lambda$1150/1830704523@26415f0b)
当您从x获得任何值并将任何值传递给它时。它将用v1连接该值。
scala> x.head(1)
res16: String = a1
scala> x.last(5)
res17: String = b5
scala> x.last("a")
res18: String = ba
scala> x.last(5.0f)
res19: String = b5.0
但是在第一个版本中,它仅采用l2的值,因为它们已显式连接。这就是为什么两者不同的原因。