2012-01-25 85 views
1

我试图将Java函数转换为等效的Groovy代码,但我无法找到任何在循环中执行&&操作的东西。任何人都可以指导我..将Java代码转换为Groovy

到目前为止,这是我得到

public List getAlert(def searchParameters, def numOfResult) throws UnsupportedEncodingException 
{ 
    List respList=null 
    respList = new ArrayList() 
    String[] searchStrings = searchParameters.split(",") 
    try 
    { 
     for(strIndex in searchStrings) 
     { 
      IQueryResult result = search(searchStrings[strIndex]) 
      if(result!=null) 
      { 
       def count = 0 

       /*The below line gives me error*/ 
       for(it in result.document && count < numOfResult) 
       { 

       } 
      } 
     } 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace() 
    } 
} 

我的Java代码

public List getAlert(String searchParameters, int numOfResult) throws UnsupportedEncodingException 
{ 
    List respList = null 
    respList = new ArrayList() 
    String[] searchStrings = searchParameters.split(",") 
    try { 
     for (int strIndex = 0; strIndex < searchStrings.length; strIndex++) { 
     IQueryResult result = search(searchStrings[strIndex]) 
     if (result != null) { 
      ListIterator it = result.documents() 
      int count = 0 
      while ((it.hasNext()) && (count < numOfResult)) { 
      IDocumentSummary summary = (IDocumentSummary)it.next() 

      if (summary != null) { 

       String docid = summary.getSummaryField("infadocid").getStringValue() 
       int index = docid.indexOf("#") 
       docid = docid.substring(index + 1) 


       String url = summary.getSummaryField("url").getStringValue() 
       int i = url.indexOf("/", 8) 
       String endURL = url.substring(i + 1, url.length()) 
       String body = summary.getSummaryField("infadocumenttitle").getStringValue() 

       String frontURL = produrl + endURL 
       String strURL 
       strURL = frontURL 
       strURL = body 
       String strDocId 
       strDocId = frontURL 
       strDocId = docid 

       count++ 
      } 
      } 
     } 
     result = null 
     } 
    } catch (Exception e) { 
     e.printStackTrace() 
     return respList 
    } 
    return respList 
    } 

回答

2

在我看来,像

def summary = result.documents.first() 
if (summary) { 
      String docid = summary.getSummaryField("infadocid").getStringValue() 
      ... 
      strDocId = docid   
} 

就是你真的需要,因为当你想要处理第一条记录时,for循环实际上没有什么意义。

如果有result.documents包含null这个可能,然后用find()

编辑取代first():要处理多个结果:

def summaries = result.documents.take(numOfResult) 

// above code assumes result.documents contains no nulls; otherwise: 
// def count=0 
// def summaries = result.documents.findAll { it && count++<numOfResult } 

summaries.each { summary -> 
      String docid = summary.getSummaryField("infadocid").getStringValue() 
      ... 
      strDocId = docid   
} 

在地道Groovy代码,许多环路替换为迭代方法,如each()

+0

对不起..这是我的错误..其实是'计数 Ricky

+0

非常感谢,代码减少到10%:) – Ricky

1
/*The below line gives me error*/ 
for(it in result.document && count < 1) 
{ 

} 

此行是给你一个错误,因为result.document会尝试调用result.getDocument()不存在。

另外,您应该避免在Groovy中使用it作为变量名称,因为在关闭的范围内,it是第一个闭包参数的缺省名称。

我没有彻底地查看代码(或者像孩子们说的那样,“tl; dr”),但是我怀疑如果你只是将.java文件重命名为.groovy,它可能会起作用。

+0

谢谢我不会在关闭里面使用'it'。此外,我已经通过转换.java运行程序到.groovy它工作正常..但我要求转换的原因是,我听说,阅读并看到groovy使很多行消失:) – Ricky

+0

写得很好的Groovy代码通常比等效的Java代码短50%,但写得不好的Groovy可能比写得很好的Java更长。 –