说我有两张地图:
val a = Map(1 -> "one", 2 -> "two", 3 -> "three")
val b = Map(1 -> "un", 2 -> "deux", 3 -> "trois")
Run Code Online (Sandbox Code Playgroud)
我想通过键合并这些映射,应用一些函数来收集值(在这种特殊情况下,我想将它们收集到一个seq中,给出:
val c = Map(1 -> Seq("one", "un"), 2 -> Seq("two", "deux"), 3 -> Seq("three", "trois"))
Run Code Online (Sandbox Code Playgroud)
感觉应该有一个很好的,惯用的方式来做这个 - 任何建议?如果解决方案涉及scalaz,我很高兴.
我正在进行大型Oracle数据库的批量迁移.第一步是将一大堆表重命名为稍后删除它们的准备(但我现在需要将数据保存在其中).需要删除对它们的任何外键约束 - 它们根本不应连接到数据库的其余部分.如果我现在放弃它们我可以使用CASCADE CONSTRAINTS,但重命名只是改变了约束.
有没有办法可以放弃CASCADE CONSTRAINTS在不丢弃表本身的情况下放下的所有约束?
以下语句编译正常并按预期工作:
val map : Map[_ >: Int with String, Int] = Map(1 -> 2, "Hello" -> 3)
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试添加到地图:
map + ((3,4))
Run Code Online (Sandbox Code Playgroud)
要么
map + (("Bye", 4))
Run Code Online (Sandbox Code Playgroud)
然后我得到一个类型不匹配:
发现:java.lang.String("Bye")
required:_ $ 1其中type _ $ 1>:Int with String
如果我弱化类型签名以允许Any作为Key的类型,那么这一切都按预期工作.
我的直觉说这与Map的键类型的不变性有关,并且_ $ 1在某种程度上被固定为特定的超类型Int with String,但我对此并不特别满意.谁能解释一下发生了什么?
编辑添加:
如果您想知道这出现在哪里,那么如果您执行以下操作,则会获得签名:
val map = if (true) Map(1 -> 2) else Map("1" -> 2)
Run Code Online (Sandbox Code Playgroud) 假设我有一个Option[A => Boolean],一个List[A]和一些我希望在该列表的子集上执行的操作.如果设置了该选项,那么我想首先过滤列表然后应用我的操作.如果没有,那么我想将它应用于整个列表.一个例子:
val a : Option[Int => Boolean] = Option((a : Int) => a % 2 == 0)
val b = 1 to 100
Run Code Online (Sandbox Code Playgroud)
我可以轻松地做到以下几点:
val c = if (a.isDefined) b.filter(a.get) else b
Run Code Online (Sandbox Code Playgroud)
但是,这涉及到呼叫a.get; 很多条件让我无法做到这一点!我也可以这样做:
val c = b.filter(a.getOrElse(_ => true))
Run Code Online (Sandbox Code Playgroud)
这感觉更好,但现在我仍然坚持为我序列的每个元素执行第二次(尽管是微不足道的)操作.我希望它会被优化,但这仍然感觉不完美.
我想要的是缺少任何缺陷的东西.感觉应该有一个很好的方式去做 - 任何想法?
我有以下基类:
trait Foo
abstract class Bar[A <: Foo](f : A*) extends Foo
Run Code Online (Sandbox Code Playgroud)
我想创建一个子类:
case class Baz(f : Foo*) extends Bar(f)
Run Code Online (Sandbox Code Playgroud)
但是,当我这样做时,编译器会感到沮丧,告诉我:
推断类型参数[Seq [Foo]]不符合类Bar的类型参数边界[A <:Foo]
向Bar添加显式类型参数,如
case class Baz(f : Foo*) extends Bar[Foo](f)
Run Code Online (Sandbox Code Playgroud)
然后抱怨类型不匹配 - 当需要Foo时发现Foo*.
是什么导致了这个?我应该如何解决这个问题?