首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >最好的groovy闭包成语取代java内部类?

最好的groovy闭包成语取代java内部类?
EN

Stack Overflow用户
提问于 2009-04-17 01:42:42
回答 3查看 4.3K关注 0票数 0

作为新鲜事..。

我试图将java成语替换为事件侦听器、过滤器等。

我在groovy中的工作代码如下:

代码语言:javascript
复制
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“代码,我可能会执行如下操作,但它不起作用:

代码语言:javascript
复制
Objects<Prospect> src = odb.getObjects( {
        boolean match(p) { 
            if (p.url) {
            return p.url.endsWith(".biz");
        }
            return false; 
        }
    } as SimpleNativeQuery);

或者更好,我希望是这样的:

代码语言:javascript
复制
 Objects<Prospect> src = odb.getObjects( 
      { it.url.endsWith(".biz") } as SimpleNativeQuery
 );

但是,groovy如何将"match“方法与外部脚本上下文关联起来,并使我失望。

我觉得很帅..。总之,很好,所以我会更多地了解它。谢谢。

我应该问的是如何在groovy中实现“匿名”类。以下是java的成语:

代码语言:javascript
复制
void defReadAFile() {
    File[] files = new File(".").listFiles(new FileFilter() {
        public boolean accept(File file) {
            return file.getPath().endsWith(".biz");
        }
    });
}

groovy可以在没有额外的类声明的情况下简洁吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-04-17 04:01:37

我想,如果你把问题抽象出来,这样它就不依赖于Neodatis接口了--这就让我陷入了一个循环,因为我从来没有使用过它,它会帮助你得到答案。我在下面写的关于它的文章是基于一个非常粗略的分析。

就这一点而言,我也从未使用过Groovy,尽管我喜欢我所看到的。但既然还没有人回答,你就被我困住了:-)

我认为问题(或者至少部分问题)可能是您对SimpleNativeQuery类期望过高。在将对象添加到返回的集合之前,它甚至都不尝试过滤对象。我认为您应该使用org.neodatis.odb.impl.core.query.criteria.CriteriaQuery。(注意到包路径中的"impl“。这让我有点紧张,因为我不确定这个类是否要被调用者使用。但是,我没有看到其他任何允许指定查询条件的类。)

但是,与其直接使用CriteriaQuery,我认为您更愿意将它封装在Groovy类中,这样就可以在闭包中使用它。因此,我认为带有闭包的Groovy版本可能如下所示:

代码语言:javascript
复制
// 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") } 
      )
 )

我希望这能帮到你!

票数 1
EN

Stack Overflow用户

发布于 2009-04-17 14:00:11

我相信您真正的问题是“在调用不使用闭包的Java时,我是否可以使用闭包而不是匿名类”。答案是肯定的“是”。这是:

代码语言:javascript
复制
 Objects<Prospect> src = odb.getObjects( 
      { it.url.endsWith(".biz") } as SimpleNativeQuery
 );

应该行得通。您编写了“然而,groovy如何将"match”方法与外部脚本上下文关联起来,从而使我失败“。它到底是怎么失败的?在我看来,您似乎有一个简单的技术问题来获得解决方案,这既是“groovy的方式”,也是您想要的工作方式。

票数 1
EN

Stack Overflow用户

发布于 2009-04-17 14:13:13

是的,谢谢你们,这很管用。

我还发现了为什么SimpleNativeQuery不能工作(per does )。

我尝试了下面的方法,效果非常好。所以这个成语确实能像预期的那样起作用。

代码语言:javascript
复制
new File("c:\\temp").listFiles({ it.path.endsWith(".html") } as FileFilter);

这下一个不能工作,因为新的接口。接口不强制使用match()方法!它只在文档中提到它,而在类文件中却不存在:

代码语言:javascript
复制
public class SimpleNativeQuery extends AbstactQuery{

}

Objects<Prospect> src = odb.getObjects( 
  { it.url.endsWith(".biz") } as SimpleNativeQuery
);

在上面的示例中,由于SimpleNativeQuery没有match()方法,所以groovy编译器无法识别应该将闭包附加到SimpleNativeQuery中的哪个方法;然后默认为外部groovy脚本。

这是我第三天和花花公子在一起,我很喜欢。

这两本书都很棒:- Groovy (Scott )-编程Groovy ()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/758700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档