作为新鲜事..。
我试图将java成语替换为事件侦听器、过滤器等。
我在groovy中的工作代码如下:
def find() {
ODB odb = ODBFactory.open(files.nodupes); // data nucleus object database
Objects<Prospect> src = odb.getObjects(new QProspect());
src.each { println it };
odb.close();
}
class QProspect extends SimpleNativeQuery {
public boolean match(Prospect p) {
if (p.url) {
return p.url.endsWith(".biz");
}
return false;
}
}现在,这与我在java中的习惯相去甚远,在java中,查询接口的实现是在odb.getObjects()方法中完成的。如果我在哪里编写"java“代码,我可能会执行如下操作,但它不起作用:
Objects<Prospect> src = odb.getObjects( {
boolean match(p) {
if (p.url) {
return p.url.endsWith(".biz");
}
return false;
}
} as SimpleNativeQuery);或者更好,我希望是这样的:
Objects<Prospect> src = odb.getObjects(
{ it.url.endsWith(".biz") } as SimpleNativeQuery
);但是,groovy如何将"match“方法与外部脚本上下文关联起来,并使我失望。
我觉得很帅..。总之,很好,所以我会更多地了解它。谢谢。
我应该问的是如何在groovy中实现“匿名”类。以下是java的成语:
void defReadAFile() {
File[] files = new File(".").listFiles(new FileFilter() {
public boolean accept(File file) {
return file.getPath().endsWith(".biz");
}
});
}groovy可以在没有额外的类声明的情况下简洁吗?
发布于 2009-04-17 04:01:37
我想,如果你把问题抽象出来,这样它就不依赖于Neodatis接口了--这就让我陷入了一个循环,因为我从来没有使用过它,它会帮助你得到答案。我在下面写的关于它的文章是基于一个非常粗略的分析。
就这一点而言,我也从未使用过Groovy,尽管我喜欢我所看到的。但既然还没有人回答,你就被我困住了:-)
我认为问题(或者至少部分问题)可能是您对SimpleNativeQuery类期望过高。在将对象添加到返回的集合之前,它甚至都不尝试过滤对象。我认为您应该使用org.neodatis.odb.impl.core.query.criteria.CriteriaQuery。(注意到包路径中的"impl“。这让我有点紧张,因为我不确定这个类是否要被调用者使用。但是,我没有看到其他任何允许指定查询条件的类。)
但是,与其直接使用CriteriaQuery,我认为您更愿意将它封装在Groovy类中,这样就可以在闭包中使用它。因此,我认为带有闭包的Groovy版本可能如下所示:
// Create a class that wraps CriteriaQuery and allows you
// to pass closures. This is wordy too, but at least it's
// reusable.
import org.neodatis.odb.impl.core.query.criteria;
class GroovyCriteriaQuery extends CriteriaQuery {
private final c;
QProspect(theClosure) {
// I prefer to check for null here, instead of in match()
if (theClosure == null) {
throw new InvalidArgumentException("theClosure can't be null!");
}
c = theClosure;
}
public boolean match(AbstractObjectInfo aoi){
//!! I'm assuming here that 'aoi' can be used as the actual
//!! object instance (or at least as proxy for it.)
//!! (You may have to extract the actual object from aoi before calling c.)
return c(aoi);
}
}
// Now use the query class in some random code.
Objects<Prospect> src = odb.getObjects(
new GroovyCriteriaQuery(
{ it.url.endsWith(".biz") }
)
)我希望这能帮到你!
发布于 2009-04-17 14:00:11
我相信您真正的问题是“在调用不使用闭包的Java时,我是否可以使用闭包而不是匿名类”。答案是肯定的“是”。这是:
Objects<Prospect> src = odb.getObjects(
{ it.url.endsWith(".biz") } as SimpleNativeQuery
);应该行得通。您编写了“然而,groovy如何将"match”方法与外部脚本上下文关联起来,从而使我失败“。它到底是怎么失败的?在我看来,您似乎有一个简单的技术问题来获得解决方案,这既是“groovy的方式”,也是您想要的工作方式。
发布于 2009-04-17 14:13:13
是的,谢谢你们,这很管用。
我还发现了为什么SimpleNativeQuery不能工作(per does )。
我尝试了下面的方法,效果非常好。所以这个成语确实能像预期的那样起作用。
new File("c:\\temp").listFiles({ it.path.endsWith(".html") } as FileFilter);这下一个不能工作,因为新的接口。接口不强制使用match()方法!它只在文档中提到它,而在类文件中却不存在:
public class SimpleNativeQuery extends AbstactQuery{
}
Objects<Prospect> src = odb.getObjects(
{ it.url.endsWith(".biz") } as SimpleNativeQuery
);在上面的示例中,由于SimpleNativeQuery没有match()方法,所以groovy编译器无法识别应该将闭包附加到SimpleNativeQuery中的哪个方法;然后默认为外部groovy脚本。
这是我第三天和花花公子在一起,我很喜欢。
这两本书都很棒:- Groovy (Scott )-编程Groovy ()
https://stackoverflow.com/questions/758700
复制相似问题