2010-10-29 7 views
8

ठीक है, यह आसान होना चाहिए ...ग्रूवी (फ़ाइल आईओ): सभी फाइलों को खोजने के लिए और सभी फ़ाइलों को लौट - ग्रूवी तरह से

मैं ग्रूवी के लिए नया हूँ और मैं निम्नलिखित तर्क लागू करने के लिए देख रहा हूँ:

def testFiles = findAllTestFiles(); 

अभी तक, मैं नीचे दिए गए कोड के साथ आया हूं जो सफलतापूर्वक सभी फाइलों के नाम प्रिंट करता है। हालांकि, प्रिंटिंग के बजाय, मुझे बस उन्हें एक संग्रह में रखना होगा। बेशक, मैं इसे पुराना जावा तरीका कर सकता हूं: बस एक संग्रह को तुरंत चालू करें, सभी तत्व जोड़ें और इसे वापस करें। हालांकि, यह मुझे कुछ भी नहीं सिखाएगा।

तो आप इसे शांत, "ग्रोवी" तरीके से कैसे करते हैं?

static File[] findAllTestFiles() { 
    def directory = new File("src/test/java"); 
    def closure = {File f -> if(f.name =~ /Test\.java$/) println f } 
    directory.eachFileRecurse FileType.FILES, closure 
    return null; 
} 

मैं जबकि अभी भी पठनीय होने यथासंभव कम कोड का उपयोग कर findAlltestFiles() ग्रूवी में लागू करने के लिए देख रहा हूँ।

उत्तर

12

की तरह अपने कोड को संशोधित करने लगता है कि मैं पूरी तरह से संग्रह के निर्माण से बचने की कोशिश होगी। तब

import groovy.io.FileType 

def withEachTestFile(Closure closure) { 
    new File("src/test/java").eachFileRecurse(FileType.FILES) { 
     if (it.name =~ /Test\.java$/) { 
      closure.call(it) 
     } 
    } 
} 

अगर आप परीक्षण फ़ाइलों पर कुछ करना चाहता हूँ, तो आप सीधे बिना कर सकते हैं: बंद का उपयोग करना, आप क्या आप वास्तव में चाहते से फ़ाइलों का चयन करने तर्क अलग कर सकते हैं तो जैसे उन लोगों के साथ क्या करना है, स्मृति में एक सूची का निर्माण:

withEachTestFile() { println it } 

या यदि आप वास्तव में सूची चाहते हैं, आप आसानी से इसे उत्पन्न कर सकते हैं, जो कुछ भी संग्रह का उपयोग कर बनाता है भावना:

def files = [] 
withEachTestFile() { files << it } 
+0

मुझे लगता है कि मुझे वास्तव में फाइलों की सूची की आवश्यकता है लेकिन मैं शायद गलत हूं (क्योंकि यह मेरी पहली ग्रोवी क्लास है)। मैं आपके पहले सुझाव को और अधिक अच्छी तरह से मानूंगा - यह ** ** महान ** अंतर्दृष्टि जैसा लगता है। मुझे यह समझने के लिए खेलना होगा कि आप क्या कह रहे हैं और इसे कैसे लागू करें - यह चीजों के बारे में सोचने का एक बिल्कुल अलग तरीका है! मुझे यह पसंद है ... तेजी से मुझ पर बढ़ रहा है। – gMale

+0

मैंने अपनी पूरी लिपि फिर से लिखी है, * बंद * के साथ डिजाइन करने की कोशिश कर रहा है। कभी-कभी, यह अभी भी मेरे सिर को गहराई से सोचने के लिए थोड़ा सा दर्द देता है। लेकिन मुझे ग्रोवी पर बेचा गया है इसलिए मुझे कुछ किताबें मिलेंगी और इस नए दृष्टिकोण को महारत हासिल करना शुरू करेंगी। मैं ग्रोवी कंसोल का उपयोग कैसे करना सीखने के लिए उत्साहित हूं ... आपकी मदद के लिए धन्यवाद। – gMale

2

कुछ इस तरह काम करना चाहिए

def files = [] 
new File("src/test/java").eachFileRecurse(FILES) { 
    if(it.name =~ /Test\.java$/)) { 
     println f 
     files << f 
    } 
} 

या मैं इस

static File[] findAllTestFiles() { 
    def files = [] 
    def directory = new File("src/test/java"); 
    def closure = {File f -> if(f.name =~ /Test\.java$/) {println f; files << f} } 
    directory.eachFileRecurse FileType.FILES, closure 
    return files; 
} 
+0

धन्यवाद! आपका जवाब बिंदु पर था और बहुत उपयोगी था। काश मैं आपको सही उत्तर के लिए अंक भी दे सकता हूं! सहायता करने के लिए समय निकालने के लिए धन्यवाद। – gMale

2

निम्नलिखित अपरीक्षित है, ख केन्द्र शासित प्रदेशों findAll विधि की मदद करनी चाहिए अपने कोड बहुत संक्षिप्त बनाने:

List<File> files = new File("src/test/java").listFiles().findAll { it.name =~ /Test\.java$/ } 
10

एक नया, मानक और अधिक सामान्य तरीके से एक निर्देशिका है जो कई बंद कॉलबैक का समर्थन करता है पार करने के लिए traverse है।

import static groovy.io.FileType.FILES 
... 
def files = [] 
new File("src/test/java").traverse(type: FILES, nameFilter: ~/Test\.java$/) { 
    files << it  
} 
संबंधित मुद्दे