2010-10-29 21 views
8

Tamam Groovy yolu ...Groovy (Dosya IO): Tüm dosyaları bulmak ve tüm dosyaları iade - bu kolay olmalıdır

Ben groovy yeni ve ben şu mantığı uygulamak için arıyorum:

def testFiles = findAllTestFiles(); 

Şimdiye kadar, tüm dosya adlarını başarıyla basan aşağıdaki kodla geldim. Ancak, baskı yerine, onları bir koleksiyona koymam gerek. Tabii ki bu eski java şekilde yapabilirsiniz: sadece bir koleksiyon örneğini tüm unsurları ekleyebilir ve bunu geri döndürür. Ancak, bu bana hiçbir şey öğretmezdi.

Peki bu serin, "Groovy" yol yapacağım?

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; 
} 

Hala okunabilir sırasında mümkün olduğunca az kod kullanarak findAlltestFiles() Groovy uygulamak için arıyorum. Böyle

cevap

12

gibi kodunuzu değiştirerek düşünüyorum. Test dosyalar üzerinde bir şeyler yapmak istiyorsanız, Sonra

import groovy.io.FileType 

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

sen olmadan doğrudan yapabilirsiniz: kapanışları kullanarak, şöyle onlarla yapmak aslında ne istediğini dosyaları seçmek için mantık ayırabilirsiniz bellekte bir liste oluşturma: ne olursa olsun koleksiyonunu kullanarak, gerçekten listeyi isterseniz

withEachTestFile() { println it } 

ya, bunu kolayca üretebilirsiniz yapar duyu:

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

Ben gerçekten dosyaların listesini gerek ama (bu şimdiye kadar, benim ilk Groovy sınıf olduğundan) Muhtemelen yanılıyorum hissediyorum. İlk öneriyi daha ayrıntılı olarak ele alacağım - bir ** harika ** anlayışa benziyor. Tam dediğini ve nasıl uygulamaya şeyi anlamak için onunla oynamak zorunda gidiyorum - bu şeylerin düşünce tamamen farklı bir yoldur! Beğendim ... mükemmel, hızlı büyüyor. – gMale

+0

Aklımda * kapanışları * ile tasarımı çalışırken, benim bütün senaryoyu yeniden yazdık. Bazen, kafamı biraz düşünmek için biraz ağrıyor. Ama ben Groovy'de satıldım, böylece birkaç kitap alıp bu yeni yaklaşıma hakim olmaya başlayacağım. Groovy Console'u kullanmayı öğrenmek için heyecanlıyım ... yardımlarınız için teşekkürler. – gMale

2

şey

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

çalışması gerekir veya i Tamamen koleksiyonunu oluşturmaya kaçınabilirsiniz bu

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

teşekkürler! Cevabınız noktaya geldi ve çok yardımcı oldu. Ayrıca, doğru cevap için puan verebilmeyi dilerdim! Yardım etmeye zaman ayırdığınız için teşekkürler. – gMale

2

aşağıdaki denenmemiş, b findAll yöntem kod çok özlü olmasına yardımcı olmalıdır ut:

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

daha yeni, standart ve daha genel bir yol birden kapatma geri aramalar destekleyen bir dizin çapraz geçiş için traverse olduğunu.

import static groovy.io.FileType.FILES 
... 
def files = [] 
new File("src/test/java").traverse(type: FILES, nameFilter: ~/Test\.java$/) { 
    files << it  
} 
İlgili konular