- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
来自Java背景,我正在学习Scala,以下内容使我感到非常困惑。为什么在这两个(非常相似但又不同)的构造中返回的类型不同,这些构造仅在构建源集合的方式上有所不同-
val seq1: IndexedSeq[Int] = for (i <- 1 to 10) yield i
val seq2: Array[Int] = for (i <- Array(1, 2, 3)) yield i
最佳答案
通常,有两种不同样式的收集操作库:
filter
,
take
,
drop
等操作完全保留类型,这些操作只会使现有元素保持不变。对于
map
之类的操作,它将尝试查找仍可以保存结果的最接近的父类(super class)型。例如。通过从
IntSet
到
Int
的功能在
String
上进行映射显然不会导致
IntSet
,而只会导致
Set
。将
IntSet
映射到
Boolean
可以用
BitSet
表示,但是我知道没有足够聪明的集合框架可以真正做到这一点。
IEnumerable
,在Java中,它们返回
Stream
,在C++中,它们返回迭代器,在Ruby中,它们返回数组。
Array
,当您在
map
上使用
Array
时,您将获得一个
Array
。
Range
。现在,虽然
Range
实际上没有元素。它只有一个起点,一个终点和一个步骤,并且在您迭代时按需生成元素。因此,使用新元素生成新的
Range
并非易事。
map
函数基本上需要能够对映射函数进行“反向工程”,以弄清楚新的起点和终点以及步骤应该是什么。 (这相当于解决停止问题,换句话说,这是不可能的。)如果执行以下操作,该怎么办:
val seq1: IndexedSeq[Int] = for (i <- 1 to 10) yield scala.util.Random.nextInt(i)
Range
。
Range
不能返回
Range
。因此,它做的第二件事是:它返回可以包含映射值的最精确的
Range
super 类型。在这种情况下,恰好是
IndexedSeq
。
map
下集合的基数应该是不变的,换句话说,
map
应该将每个元素精确地映射到一个新元素,因此
map
绝不应该改变集合的大小。但是,这段代码呢:
Set(1, 2, 3).map { _ % 2 == 0 }
//=> Set(true, false)
map
取回了元素较少的集合,该集合仅应转换元素,而不能删除它们。但是,由于我们决定要保留类型的集合,并且
Set
不能有重复的值,所以两个
false
值实际上是相同的值,因此集合中只有一个。
Set
不是集合,不应将其视为集合。
Set
是谓词(“此元素是成员吗?”),而不是集合(“给我所有元素!”)
关于scala - IndexedSeq [Int]与Array [Int],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61976188/
你如何排序 IndexedSeq在斯卡拉的地方? API函数在哪里? 最佳答案 目前没有什么可以就地对它们进行排序。 如果您确实需要,可以转换 IndexedSeq到 Array[AnyRef]并使用
来自Java背景,我正在学习Scala,以下内容使我感到非常困惑。为什么在这两个(非常相似但又不同)的构造中返回的类型不同,这些构造仅在构建源集合的方式上有所不同- val seq1: Index
在scala集合库中Buffer继承自Seq: Buffer[A] extends Seq[A] with GenericTraversableTemplate[A, Buffer] with Buf
在scala集合库中Buffer继承自Seq: Buffer[A] extends Seq[A] with GenericTraversableTemplate[A, Buffer] with Buf
我有一个环绕 Seq.tail 的函数。我希望函数为 List 返回 List,为 IndexedSeq、Seq 返回 IndexedSeq > 对于 Seq。 目前我使用 asInstanceOf
在 Scala 2.11.2 中,以下最小示例仅在使用 时编译类型归属 在 Array[String] : object Foo { def fromList(list: List[Stri
在 Scala Collection documentation ,这个问题有一些线索: Trait Seq has two subtraits LinearSeq, and IndexedSeq.
我正在尝试解决 Codility 的 GenomicRangeQuery使用 Scala,为此我编写了以下函数: def solution(s: String, p: Array[Int], q: A
match有什么原因吗?写反对 Seq在 IndexedSeq 上的工作方式会有所不同类型比它在 LinearSeq 上的方式类型?对我来说,无论输入类型如何,下面的代码似乎都应该做完全相同的事情。当
我认为在 scala 中没有 Map[IndexedSeq[String], Int] 的默认格式(对吗?)所以我编写了自己的格式如下,但是它非常慢。有更好的方法吗? class IndexedSeq
不知道为什么下面的scala代码无法编译: import collection.immutable.Seq def foo(nodes: Seq[Int]) = null val nodes:Inde
我是一名优秀的程序员,十分优秀!