Render an aligned plain-text table in Groovy

Groovy
def render(List<Map> rows, List<String> columns) {
    List<List<String>> cells = [columns] + rows.collect { row ->
        columns.collect { col -> row[col]?.toString() ?: '' }
    }
    List<Integer> widths = (0..<columns.size()).collect { i ->
        cells.collect { it[i].length() }.max()
    }
    String rule = widths.collect { '-' * it }.join('-+-')
    def formatRow = { List<String> values ->
        (0..<values.size()).collect { i -> values[i].padRight(widths[i]) }.join(' | ')
    }
    List<String> lines = [formatRow(columns), rule]
    lines.addAll(cells.drop(1).collect(formatRow))
    lines
}

def data = [[name: 'alpha', size: 12], [name: 'b', size: 340]]
render(data, ['name', 'size']).each { println it }