Я не знаю ни одного "идиоматического" способа сделать это, хорошая загадка!= D
Вы можете попробовать передать eachDir
или любую аналогичную функцию функции, которая будет собирать свои итерации:
def collectIterations(fn) {
def col = []
fn {
col << it
}
col
}
И теперь вы можете использовать ее как:
def dir = new File('/path/to/some/dir')
def subDirs = collectIterations(dir.&eachDir)
def file = new File('/path/to/some/file')
def lines = collectIterations(file.&eachLine)
(последний пример эквивалентен file.readLines()
)
И только для бонусных баллов вы можете определить эту функцию как метод в классе Closure
:
Closure.metaClass.collectIterations = {->
def col = []
delegate.call {
col << it
}
col
}
def dir = new File('/path/to/some/dir')
def subDirs = dir.&eachDir.collectIterations()
def file = new File('/path/to/some/file')
def lines = file.&eachLine.collectIterations()
Обновление : С другой стороны, вы могли бы также сделать:
def col = []
someDir.eachDir col.&add
Что, на мой взгляд, является менее запутанным, но оно не использует метод collect
, как вызапросил:)