2012-01-25 84 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更長。 –