2

これは私のコードです

def testMap() = {
    val x = Map(
      1 -> Map(
        2 -> 3,
        3 -> 4
      ),
      5 -> Map(
        6 -> 7,
        7 -> 8
      )
    )

    for {
      (a, v) <- x
      (b, c) <- v
    } yield {
      a
    }
  }

上記のコードは

List(1, 1, 5, 5)

for 内包表記の yield 値を に変更するa(a, b)、結果は次のようになります。

Map(1 -> 3, 5 -> 7)

に変更(a, b)する(a, b, c)と、結果は

List((1,2,3), (1,3,4), (5,6,7), (5,7,8))

私の質問は、これを理解するための結果の型の決定の背後にあるメカニズムは何ですか?

4

2 に答える 2

0

@dth に追加するには、リストが必要な場合は次のようにします。

val l = Map(1->2,3->4).view.map( ... ).toList

ここで map 関数は lazy に適用され、IterableViewも出力IterableViewされ、実際の構築は によってトリガーされますtoList

注: また、使用しないviewと、危険な動作が発生する可能性があります。例:

val m = Map(2->2,3->3)

val l = m.map{ case (k,v) => (k/2,v) ).toList
// List((1,3))

val l = m.view.map{ case (k,v) => (k/2,v) ).toList
// List((1,2), (1,3))

.viewここで、重複キーをオーバーライドする Map を出力する (そして追加の不必要な作業を行う) マップを省略すると、

于 2016-04-15T14:00:10.483 に答える