小编Ral*_*lph的帖子

Clojure GUI编程很难

我正在使用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)

mvp scala clojure mocking

13
推荐指数
2
解决办法
3099
查看次数

通过过滤器进行Clojure分区

在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)

partitioning clojure

13
推荐指数
1
解决办法
4339
查看次数

用于获取子集列表的REST最佳实践

我在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),完全支持矩阵参数.

rest

12
推荐指数
1
解决办法
5876
查看次数

Clojure闭包和GC

我的理解是,Java中使用的默认ClassLoader(以及Clojure)持有指向创建的任何匿名类的指针,因此指向lambdas和闭包.这些永远不会被垃圾收集,因此代表了"内存泄漏".对Java 7或8进行了一些调查(https://blogs.oracle.com/jrose/entry/anonymous_classes_in_the_vm)添加一个不会保留对这些函数的引用的匿名ClassLoader.与此同时,人们如何处理用Clojure和Scala等语言编写长期运行的应用程序,以鼓励使用这些结构?

有没有可能Clojure可以提供自己的匿名ClassLoader,扩展系统一个,但不保留创建的类?

closures garbage-collection clojure

12
推荐指数
1
解决办法
795
查看次数

Java Futures的无序返回

我可以使用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())如果没有准备好了吗?

java concurrency future

12
推荐指数
2
解决办法
2651
查看次数

强制Maven2将源jar下载到本地存储库

我在Nexus存储库中有我的公司依赖项(包括非FOSS第三方的东西),包括源jar(下载的mvn dependency:resolve),如果可用的话.

我想将源jar(和javadoc jar)下载到我的本地repository(~/.m2/repository),以便我可以"离线".

我尝试了各种组合mvn dependency:resolve dependency:go-offline -Dclassifier=sources,但它似乎没有将它们复制到我的本地存储库.

谢谢.

dependencies maven-2

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

在Scala中定义从字符串到函数的映射

我正在尝试使用键: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)

types scala map

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

Scala StringBuilder

是否有一个隐式方法将scala.collection.mutable.StringBuilder转换为java.lang.StringBuilder?

我正在使用一个Java库(JCommander),其中一个方法(usage)接受一个java.jang.StringBuilder参数.

stringbuilder scala implicit-conversion

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

Scala的Java 7风格自动资源管理

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(...) { }

java scala

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

将Clojure与基于注释的REST服务器一起使用

我正在考虑使用Clojure编写REST服务器.

我有使用RESTEasy和Java的经验.它使用注释将URL,模板参数和查询参数与Java类,方法和方法参数相关联.我相信Jersey REST服务器也使用注释(因为它也基于JAX-RS).

是否可以在Clojure中使用这些框架?是否有正式的方法将注释与功能相关联?

rest jax-rs clojure

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