我有一个Java抽象类ImmutableEntity和几个包含类级注释的子类@DBTable.我试图使用尾递归Scala方法搜索类层次结构中的注释:
def getDbTableForClass[A <: ImmutableEntity](cls: Class[A]): String = {
@tailrec
def getDbTableAnnotation[B >: A](cls: Class[B]): DBTable = {
if (cls == null) {
null
} else {
val dbTable = cls.getAnnotation(classOf[DBTable])
if (dbTable != null) {
dbTable
} else {
getDbTableAnnotation(cls.getSuperclass)
}
}
}
val dbTable = getDbTableAnnotation(cls)
if (dbTable == null) {
throw new
IllegalArgumentException("No DBTable annotation on class " + cls.getName)
} else {
val value = dbTable.value
if (value != null) {
value …Run Code Online (Sandbox Code Playgroud) 如何测试返回的集合中的每个值map是否为真?
我使用以下内容:
(defn test [f coll]
(every? #(identity %) (map f coll)))
Run Code Online (Sandbox Code Playgroud)
用匿名函数#(identity %),但我想知道是否有更好的方法.
我不能用,(apply and ...)因为and是一个宏.
更新:顺便说一句,我在做我的方式通过的哈斯克尔路逻辑,数学和编程,由基斯Doets和Jan可·艾克,但这样做在Clojure的练习.这是一本非常有趣的书.
我有一个SQL数据库表,具有以下结构:
create table category_value (
category varchar(25),
property varchar(25)
);
Run Code Online (Sandbox Code Playgroud)
我想将其读入Scala Map[String, Set[String]],其中地图中的每个条目都是同一类别中所有属性值的集合.我想以"功能"样式进行,没有可变数据(数据库结果集除外).
继Clojure loop构造之后,我提出了以下内容:
def fillMap(statement: java.sql.Statement): Map[String, Set[String]] = {
val resultSet = statement.executeQuery("select category, property from category_value")
@tailrec
def loop(m: Map[String, Set[String]]): Map[String, Set[String]] = {
if (resultSet.next) {
val category = resultSet.getString("category")
val property = resultSet.getString("property")
loop(m + (category -> m.getOrElse(category, Set.empty)))
} else m
}
loop(Map.empty)
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来做到这一点,而不使用可变数据结构?
Scala(以及函数式编程,通常)提倡一种编程风格,您可以在其中生成表单的功能"链"
collection.operation1(...).操作2(...)...
其中所述操作是的各种组合map,filter等等.
如果等效的Java代码可能需要50行,则Scala代码可以在1行或2行中完成.功能链可以将输入集合更改为完全不同的输入集合.
Scala代码的缺点是10分钟后(从不介意6个月后),我无法弄清楚我在想什么,因为符号是如此紧凑,并且缺少类型信息(因为隐含类型).
你怎么记录这个?您是否在链条之前放置了一个大块注释,将优雅的1线解决方案转换为由39行评论组成的庞大的40行解决方案?你是否像这样穿插你的评论?
collection.
// Select the items that meet condition X
filter(predicate_function).
// Change these items from A's to B's
map(transformation_function).
// etc.
Run Code Online (Sandbox Code Playgroud)
别的什么?没有文件?(让他们猜测.他们永远不会"缩小"你,因为没有其他人可以维护代码.:-))
我需要限制Scala方法参数,以便它实现特征和结构子类型.我怎样才能做到这一点?
trait Foo
// ...
def someMethod[A <: Foo xxx { def close() }](resource: A)(block: A => Unit) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
我该代替xxx什么?我都尝试extends和with,但有语法错误.
可以使用type结构子类型的定义来完成吗?
我在多线程应用程序中常用的数据结构是ConcurrentHashMap,我想在其中保存一组共享相同键的项.安装特定键值的第一项时会发生此问题.
我一直使用的模式是:
final ConcurrentMap<KEYTYPE, Set<VALUETYPE>> hashMap = new ConcurrentHashMap<KEYTYPE, Set<VALUETYPE>>();
// ...
Set<VALUETYPE> newSet = new HashSet<VALUETYPE>();
final Set<VALUETYPE> set = hashMap.putIfAbsent(key, newSet)
if (set != null) {
newSet = set;
}
synchronized (newSet) {
if (!newSet.contains(value)) {
newSet.add(value);
}
}
Run Code Online (Sandbox Code Playgroud)
这种操作有更好的模式吗?这是否是线程安全的?是否有更好的课程用于内心而Set不是java.util.HashSet?
我有三个Scala正则表达式,我需要测试它们是否与给定的String匹配.
我知道我可以做以下事情:
val matches = R1.findFirstIn(myString).isDefined ||
R2.findFirstIn(myString).isDefined ||
R3.findFirstIn(myString).isDefined
Run Code Online (Sandbox Code Playgroud)
但我相信有一种方法可以使用Scalaz库中的Applicative Functor或Monad来实现.
如何才能做到这一点?
我安装了SublimeREPL,但每次尝试启动REPL时,都会出现一个对话框,显示错误"OSError(2,'No such file or directory')".
我使用MacPorts安装了Scala 2.10.
我正在运行OS X Lion(10.8.3).
是否有一些特殊的配置我需要告诉SublimeREPL在哪里可以找到Scala可执行文件?
我有一个List[(A, Option[B])].我想过滤掉None第二个元素中包含a的所有元组然后"展开" Option,给出一个List[A, B].
我目前正在使用这个:
list.filter(_._2.isDefined).map(tup => (tup._1, tup._2.get))
Run Code Online (Sandbox Code Playgroud)
有更好的方法(更简洁)吗?
是否可以Cmd在 Elm 中创建一个在完成时不发送消息的对象?
具体来说,我试图让一个元素(以编程方式)获得焦点,但我不需要被告知结果:
Dom.focus "element-id"
|> Task.attempt FocusReceived
...
FocusReceived result ->
model ! [] -- result ignored
Run Code Online (Sandbox Code Playgroud)
有没有办法让 Elm“引擎”在此之后不发送消息Cmd?
我知道我的代码 ( FocusReceived result -> model ! []) 是空操作,但我希望根本不发送消息。
scala ×7
annotations ×1
applicative ×1
clojure ×1
elm ×1
feedback ×1
filter ×1
java ×1
map ×1
no-op ×1
regex ×1
scalaz ×1
sublimerepl ×1
sublimetext2 ×1
subtype ×1