我正在使用Swing GUI编写实用程序.我正在尝试使用Martin Fowler的演示模型来促进测试.我的应用程序将使用java.util.prefs.Preferences(即:主窗口位置和大小)自动存储多个用户首选项.我花了几个小时在周末试图创建一个PreferencesAPI 的Clojure模拟(使用EasyMock),以便我可以测试我的演示者代码,但无法使其工作.使用非OO风格的Clojure GUI编程对于长期的OO程序员来说很难.我觉得如果我能发现/开发这些东西的模式(模拟,视觉"类"的"接口"等),我可以继续在整个应用程序的其余部分使用相同的模式.
我也在Scala中开发相同的应用程序来比较编程模式并发现它更加直观,即使我试图以相当严格的函数风格使用Scala(当然不包括调用Java类,如Swing API - 它在Clojure版本中具有相同的可变性问题,但当然也将是单线程的).
在我的Scala代码中,我创建了一个名为MainFrame扩展JFrame并实现特征的类MainView.MainView将所有JFrame调用公开为抽象方法,我可以在模拟对象中实现:
trait LabelMethods {
def setText(text: String)
//...
}
trait PreferencesMethods {
def getInt(key: String, default: Int): Int
def putInt(key: String, value: Int)
//...
}
trait MainView {
val someLabel: LabelMethods
def addComponentListener(listener: ComponentListener)
def getLocation: Point
def setVisible(visible: Boolean)
// ...
}
class MainFrame extends JFrame with MainView {
val someLabel = …Run Code Online (Sandbox Code Playgroud) 在Scala中,分区方法将一个序列分成两个独立的序列 - 谓词为true的序列和为false的序列:
scala> List(1, 5, 2, 4, 6, 3, 7, 9, 0, 8).partition(_ % 2 == 0)
res1: (List[Int], List[Int]) = (List(2, 4, 6, 0, 8),List(1, 5, 3, 7, 9))
Run Code Online (Sandbox Code Playgroud)
请注意,Scala实现仅遍历序列一次.
在Clojure中,partition-by函数将序列拆分为多个子序列,每个子序列都是与谓词相符或不符合谓词的最长子集:
user=> (partition-by #(= 0 (rem % 2)) [1, 5, 2, 4, 6, 3, 7, 9, 0, 8])
((1 5) (2 4 6) (3 7 9) (0 8))
Run Code Online (Sandbox Code Playgroud)
而split-by产品:
user=> (split-with #(= 0 (rem % 2)) [1, 5, 2, 4, 6, 3, …Run Code Online (Sandbox Code Playgroud) 我在REST阅读了这篇文章- 复杂的应用程序,它回答了我的一些问题,但不是全部.
我正在设计我的第一个REST应用程序,需要将"子集"列表返回给GET请求.以下哪一项更"RESTful"?
/patients;listType=appointments;date=2010-02-22;user_id=1234
Run Code Online (Sandbox Code Playgroud)
要么
/patients/appointments-list;date=2010-02-22;user_id=1234
Run Code Online (Sandbox Code Playgroud)
甚至
/appointments/2010-02-22/patients;user_id=1234
Run Code Online (Sandbox Code Playgroud)
我需要返回十几个不同的列表.在其中一些中,将有几个过滤参数,我不希望在我的服务器代码中使用大的"if"语句来根据存在的参数选择子集.例如,我可能需要所有患者为特定医生,其中覆盖医生是另一个,主要医生是另一个.我可以选择
/patients;rounds=true;specific_id=xxxx;covering_id=yyyy;primary_id=zzzz
Run Code Online (Sandbox Code Playgroud)
但是这需要复杂的分支逻辑来获得正确的列表,其中要求特定子集(rounds-list)将实现同样的事情.
请注意,我需要使用矩阵参数而不是查询参数,因为我需要在URL的多个级别进行过滤.我正在使用的框架(RestEasy),完全支持矩阵参数.
我的理解是,Java中使用的默认ClassLoader(以及Clojure)持有指向创建的任何匿名类的指针,因此指向lambdas和闭包.这些永远不会被垃圾收集,因此代表了"内存泄漏".对Java 7或8进行了一些调查(https://blogs.oracle.com/jrose/entry/anonymous_classes_in_the_vm)添加一个不会保留对这些函数的引用的匿名ClassLoader.与此同时,人们如何处理用Clojure和Scala等语言编写长期运行的应用程序,以鼓励使用这些结构?
有没有可能Clojure可以提供自己的匿名ClassLoader,扩展系统一个,但不保留创建的类?
我可以使用Java Futures(java.util.concurrent.Future<T>)运行多个类似进程(SIMD)的唯一模型如下:
class Job extends Callable<T> {
public T call() {
// ...
}
}
List<Job> jobs = // ...
List<Future<T>> futures = ExecutorService.invokeAll(jobs);
for (Future<T> future : futures) {
T t = future.get();
// Do something with t ...
}
Run Code Online (Sandbox Code Playgroud)
此模型的问题在于,如果作业0需要很长时间才能完成,但作业1,2和3已经完成,则for循环将等待从作业0获取返回值.
是否有任何模型允许我获得每个Future结果,因为它变得可用而不只是呼叫Future.isDone()和忙碌等待(或呼叫Thread.sleep())如果没有准备好了吗?
我在Nexus存储库中有我的公司依赖项(包括非FOSS第三方的东西),包括源jar(下载的mvn dependency:resolve),如果可用的话.
我想将源jar(和javadoc jar)下载到我的本地repository(~/.m2/repository),以便我可以"离线".
我尝试了各种组合mvn dependency:resolve dependency:go-offline -Dclassifier=sources,但它似乎没有将它们复制到我的本地存储库.
谢谢.
我正在尝试使用键:String,value:定义Map文本(Any)=>String.我尝试了以下,但得到语法错误:
def foo(x: Int): String = /...
def bar(x: Boolean): String = /...
val m = Map[String, (Any) => String]("hello" -> foo, "goodbye" -> bar)
Run Code Online (Sandbox Code Playgroud) 是否有一个隐式方法将scala.collection.mutable.StringBuilder转换为java.lang.StringBuilder?
我正在使用一个Java库(JCommander),其中一个方法(usage)接受一个java.jang.StringBuilder参数.
Java 7引入了自动资源管理:
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
return br.readLine();
}
Run Code Online (Sandbox Code Playgroud)
这适用于任何实现的类java.lang.AutoClosable.
我知道有几个在Scala中进行自动资源管理的例子,包括Martin Odersky演示的一个例子.
是否有计划向Scala添加语言级资源管理,类似于Java try(...) { }?
clojure ×4
scala ×4
java ×2
rest ×2
closures ×1
concurrency ×1
dependencies ×1
future ×1
jax-rs ×1
map ×1
maven-2 ×1
mocking ×1
mvp ×1
partitioning ×1
types ×1