module OptionalParameters { typedef Type.Orderer as ColumnOrderer; typedef Type.Orderer as RowOrderer; static String[][] sort(String[][] table, ColumnOrderer? orderer = Null, Int column = 0, Boolean reverse = False, ) { // provide a default orderer orderer ?:= (s1, s2) -> s1 <=> s2; // optionally reverse the order ColumnOrderer byString = reverse ? ((s1, s2) -> orderer(s1, s2).reversed) : orderer; // sort the indicated column RowOrderer byColumn = (row1, row2) -> byString(row1[column], row2[column]); return table.sorted(byColumn); } void run() { String[][] table = [ ["c", "x", "i"], ["a", "y", "p"], ["b", "z", "a"], ]; show("original input", table); show("by default sort on column 0", sort(table)); show("by column 2", sort(table, column=2)); show("by column 2 reversed", sort(table, column=2, reverse=True)); } void show(String title, String[][] table) { @Inject Console console; console.print($"{title}:"); for (val row : table) { console.print($" {row}"); } console.print(); } }