当前位置: 首页 > 知识库问答 >
问题:

地图中的平面图如何在scala中工作?

茅昀
2023-03-14

这是我的代码

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)

如果我将用于理解a的屈服值更改为(a,b),则结果为

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

如果我将(a,b)更改为 ,结果是

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

我的问题是,这篇文章中确定结果类型的机制是什么?


共有2个答案

狄新立
2023-03-14

添加到@dth,如果需要列表,可以执行以下操作:

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

在这里,map 函数应用于惰性的 IterableView,该视图还输出一个 IterableView,实际构造由 toList 触发。

注意:另外,不使用< code>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))

这里省略了< code >。view使映射输出成为覆盖重复键的映射(并执行额外和不必要的工作)。

卫鸿朗
2023-03-14
匿名用户

当您查看API文档了解map方法的详细信息时,您会发现它有第二个类型为的隐式参数CanBuildFromCanBuildFrom的一个实例from定义了当映射到某个其他集合时如何构建某个集合,并提供了某个元素类型。

在结果得到一个映射的情况下,您是在映射上进行映射,并提供二元元组。因此,编译器会搜索能够处理该问题的< code > CanBuildFrom -实例。

为了找到这样的实例,编译器在不同的地方寻找,例如,当前范围、调用方法的类a及其伴随对象。在这种情况下,它将在< code>Map的配套对象中找到一个名为< code>canBuildFrom的隐式字段,该字段适用于构建< code>Map作为结果。因此,它尝试将结果类型推断为< code>Map,并在成功时使用该实例。

在您提供单值或三元组的情况下,在Map的伴侣中找到的实例没有所需的类型,因此它继续搜索继承树。它在Iterable的伴侣对象中找到它。实例允许构建任意元素类型的Iterable。所以编译器使用它。

那么,为什么会有一个列表?因为这恰好是这里使用的实现,所以类型系统只保证<code>可迭代。

如果希望获得一个可迭代而不是映射,可以显式提供CanBuildFrom(仅当您直接调用Map和flatMap时)实例,或者强制返回类型。在那里,您还会注意到,即使您得到了一个<code>列表,您也无法请求该列表。

这不会工作:

val l: List[Int] = Map(1->2).map(x=>3)

但是,这将:

val l: Iterable[Int] = Map(1->2).map(x=>3)

 类似资料:
  • 如何将此地图/平面图转换为便于理解的图形,请解释其工作原理,谢谢。

  • 对于理解Scala中的以下代码段,什么是最好的(无需线性/回调、较少样板)形式?

  • 问题内容: 我目前的理解非常模糊,我倾向于认为map是同步的,而flatMap是异步的,但是我真的无法解决它。 这是一个例子: 我有文件(a ),我想将其复制到服务器上的某些文件中。 本示例摘自一本书。 我可以将所有更改为to ,反之亦然,一切仍然正常。我不知道有什么区别。 问题答案: 用于同步,非阻塞,一对一转换 用于异步(非阻塞)1-to-N转换 区别在方法签名中可见: 取a 并返回a 取a

  • 我已经找到了很多关于RxJava的答案,但我想了解它在Reactor中是如何工作的。 我目前的理解是非常模糊的,我倾向于认为map是同步的,flatMap是异步的,但我不能真正理解它。 以下是一个例子: 我有文件(a

  • 请帮助理解我如何在我的例子中使用fkatMap(): 我看了留档。我知道如何工作,但我不明白我需要如何在我的例子中使用。谢谢。

  • 在谷歌地图V2中有没有隐藏地图(使不可见)瓷砖的方法? 我想拥有地图(标记,信息窗口)的所有其他功能,但不是地图,我想有静态的背景图像。作为转机,我尝试使用瓷砖覆盖,但它是加载多个图像,而不是一个,仍然是加载第一个原始地图瓷砖。 谷歌地图V2有这样的选择吗?