小编Sub*_*oid的帖子

Scala:按键合并地图

说我有两张地图:

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,我很高兴.

maps functional-programming scala scalaz

24
推荐指数
3
解决办法
2万
查看次数

Oracle - 删除表约束而不删除表

我正在进行大型Oracle数据库的批量迁移.第一步是将一大堆表重命名为稍后删除它们的准备(但我现在需要将数据保存在其中).需要删除对它们的任何外键约束 - 它们根本不应连接到数据库的其余部分.如果我现在放弃它们我可以使用CASCADE CONSTRAINTS,但重命名只是改变了约束.

有没有办法可以放弃CASCADE CONSTRAINTS在不丢弃表本身的情况下放下的所有约束?

sql oracle rename constraints table-rename

11
推荐指数
1
解决办法
4万
查看次数

无法使用动态mixin类型为键添加成员到Map

以下语句编译正常并按预期工作:

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)

types scala mixins variance

6
推荐指数
1
解决办法
320
查看次数

有条件地过滤序列

假设我有一个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)

这感觉更好,但现在我仍然坚持为我序列的每个元素执行第二次(尽管是微不足道的)操作.我希望它会被优化,但这仍然感觉不完美.

我想要的是缺少任何缺陷的东西.感觉应该有一个很好的方式去做 - 任何想法?

scala

5
推荐指数
1
解决办法
2498
查看次数

用于varargs方法的Scala类型边界

我有以下基类:

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*.

是什么导致了这个?我应该如何解决这个问题?

types scala variadic-functions

4
推荐指数
1
解决办法
325
查看次数