什么是创造一个最好的方式Map[K,V]从一个Set[K]从和功能K来V?
例如,假设我有
scala> val s = Set(2, 3, 5)
s: scala.collection.immutable.Set[Int] = Set(2, 3, 5)
Run Code Online (Sandbox Code Playgroud)
和
scala> def func(i: Int) = "" + i + i
func: (i: Int)java.lang.String
Run Code Online (Sandbox Code Playgroud)
什么是最简单的创建方式 Map[Int, String](2 -> "22", 3 -> "33", 5 -> "55")
这个答案描述了如何scala.collection.breakOut用来防止创建浪费的中间集合.例如,这里我们创建一个中间件Seq[(String,String)]:
val m = List("A", "B", "C").map(x => x -> x).toMap
Run Code Online (Sandbox Code Playgroud)
通过使用breakOut我们可以阻止这个中间体的创建Seq:
val m: Map[String,String] = List("A", "B", "C").map(x => x -> x)(breakOut)
Run Code Online (Sandbox Code Playgroud)
视图解决了同样的问题,另外还有懒惰的访问元素:
val m = (List("A", "B", "C").view map (x => x -> x)).toMap
Run Code Online (Sandbox Code Playgroud)
我假设的创建View包装是相当便宜的,所以我的问题是:有没有使用任何真正的原因breakOut在ViewS'
我在另一个答案中看到了Function.tupled示例的这种用法:Map(1 -> "one", 2 -> "two") map Function.tupled(_ -> _.length).
有用:
scala> Map(1 -> "one", 2 -> "two") map Function.tupled(_ -> _.length)
<console>:5: warning: method tupled in object Function is deprecated:
Use `f.tuple` instead
Map(1 -> "one", 2 -> "two") map Function.tupled(_ -> _.length)
^
res0: scala.collection.immutable.Map[Int,Int] = Map(1 -> 3, 2 -> 3)
Run Code Online (Sandbox Code Playgroud)
如果我不想使用占位符语法,我似乎无法做到.
scala> Map(1 -> "one", 2 -> "two") map (x => x._1 -> x._2.length)
res1: scala.collection.immutable.Map[Int,Int] = Map(1 -> 3, 2 -> …Run Code Online (Sandbox Code Playgroud) 我想初始化一个scala BitSet来包含从1到N的整数.以下内容可行,但我正在寻找更好的解决方案:
var s = BitSet.empty ++ (1 to n)
Run Code Online (Sandbox Code Playgroud)
我希望我可以这样做:
var s:BitSet = (1 to n).toSet
Run Code Online (Sandbox Code Playgroud)
......但是会导致错误:
error: polymorphic expression cannot be instantiated to expected type;
found : [B >: Int]scala.collection.immutable.Set[B]
required: scala.collection.immutable.BitSet
Run Code Online (Sandbox Code Playgroud)
我错过了一些明显的东西吗
我正在阅读斯卡拉的不耐烦,我遇到的东西让我摸不着头脑.
以下返回String:
scala> for ( c<-"Hello"; i <- 0 to 1) yield (c+i).toChar
res68: String = HIeflmlmop
Run Code Online (Sandbox Code Playgroud)
但是这会返回一个Vector:
scala> for (i <- 0 to 1; c <- "Hello") yield (c + i).toChar
res72: scala.collection.immutable.IndexedSeq[Char] = Vector(H, e, l, l, o, I, f, m, m, p)
Run Code Online (Sandbox Code Playgroud)
这两个例子前面的文字是......
"当for循环的主体以yield开始时,循环构造一个值集合,每次迭代一个......这种类型的循环称为for comprehension.生成的集合与第一个生成器兼容.
如果生成的集合与第一个生成器兼容,那么为什么第二个示例不返回Range类型,如下所示:
scala> val range = 0 to 1
range: scala.collection.immutable.Range.Inclusive = Range(0, 1)
Run Code Online (Sandbox Code Playgroud)
或者我完全误解了文本的意思,"......生成的集合与第一个生成器兼容."
我是scala的新手,我只是编写一个简单的函数来反转给定的字符串:
def reverse(s: String) : String
for(i <- s.length - 1 to 0) yield s(i)
Run Code Online (Sandbox Code Playgroud)
yield返回一个scala.collection.immutable.IndexedSeq [Char],并且不能将它转换为String.(或者是别的什么?)
我该怎么写这个功能?
看看这个REPL会话(为了便于阅读,我已整理了它):
scala> val x = 1 to 10
x: Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
scala> val y = x.toSeq
y: Range = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
scala> x eq y
res14: Boolean = true
scala> util.Random.shuffle(y)
<console>:10: error: Cannot construct a collection of type scala.collection.AbstractSeq[Int] with elements of type Int based on a collection of type scala.collection.AbstractSeq[Int].
util.Random.shuffle(y)
^
scala> util.Random.shuffle(x)
res16: scala.collection.immutable.IndexedSeq[Int] = Vector(8, 3, 4, …Run Code Online (Sandbox Code Playgroud) 我正在尝试将Lift应用程序集成到一些现有的Java代码中.在我的一个片段中,我有一个Java对象Array,我需要将它映射到NodeSeq.我可以获得一个节点数组,但不能获得NodeSeq.(至少,不是以非常实用的方式).
import scala.xml.NodeSeq
// pretend this is code I can't do anything about
val data = Array("one", "two", "three")
// this is the function I need to write
def foo: NodeSeq = data.map { s => <x>{s}</x> }
// ^
// error: type mismatch;
// found : Array[scala.xml.Elem]
// required: scala.xml.NodeSeq
Run Code Online (Sandbox Code Playgroud)
最干净的方法是什么?
大家好 请原谅我在Scala上提出一个愚蠢的问题.虽然我已经在Scala中编程了大约2年,但我仍然觉得很难理解其implicit用法.我们来举一个讨论的例子:
Array(1,2,3,4).map(x => x)
Run Code Online (Sandbox Code Playgroud)
如果你查看scaladoc,你就无法map在Array课堂上找到这个方法.map可以应用的原因是在Array(1,2,3,4)中implicit def intArrayOps (xs: Array[Int]): ArrayOps[Int]定义了隐式函数scala.Predef.
但是,有两个参数列表,第二个参数列表写为implicit bf: CanBuildFrom[Array[T], B, That]).现在我不知道该编译器发现一个适当的参数类型CanBuildFrom申请时map上Array(1,2,3,4).
我在这里有一个真正的大脑放屁.我正在使用Play Framework.我有一个方法,它采用地图并将其转换为HTML选择元素.我有一个单行程序来获取一个对象列表并将其转换为两个对象字段的地图,id并且name.但是,我是一名Java程序员,我的Scala很弱,而且我只是忘记了我是如何做到这一点的语法.
我有类似的东西
organizations.all.map {org => /* org.prop1, org.prop2 */ }
Run Code Online (Sandbox Code Playgroud)
任何人都可以完成评论部分吗?