GNU datamash - полезный инструмент для расчета такого рода вещей:
$ datamash -sHt, groupby 2 mean 3 < employees.txt
Объедините с grep
, чтобы ограничить его только названием, которое вас интересует. [ 114]
Варарги полезны для любого метода, который должен иметь дело с неопределенным числом объектов . Один хороший пример - String.format
. Строка формата может принимать любое количество параметров, поэтому вам необходим механизм для передачи любого количества объектов.
String.format("This is an integer: %d", myInt);
String.format("This is an integer: %d and a string: %s", myInt, myString);
Я часто использую varargs для конструкторов, которые могут принимать какой-то объект фильтра. Например, большая часть нашей системы, основанная на Hadoop, основана на Mapper, который обрабатывает сериализацию и десериализацию элементов в JSON и применяет несколько процессоров, каждый из которых принимает элемент содержимого и либо изменяет и возвращает его, либо возвращает ноль. отклонить.
/* Jeez, this is an ugly mess */
...comment from the X11R6 internals source code circa 1991.
компоненты) .
Наконец, реализация таких методов должна учитывать тот факт, что он может быть вызван с пустым vararg! Если вы хотите навязать хотя бы один аргумент, вы должны использовать такой уродливый трюк, как:
void f(T arg1, T... args) {...}
Я считаю этот трюк уродливым, потому что реализация метода будет менее простой, чем просто T ... args
в списке аргументов.
Надеется, что это поможет прояснить вопрос о varargs.
У меня тоже есть страх, связанный с varargs:
Если вызывающая программа передает явный массив методу (в отличие от нескольких параметров), вы получите общую ссылку на этот массив.
Если вам нужно сохранить этот массив внутри, вы можете сначала его клонировать, чтобы избежать возможности вызывающей стороны изменить его позже.
Object[] args = new Object[] { 1, 2, 3} ;
varArgMethod(args); // not varArgMethod(1,2,3);
args[2] = "something else"; // this could have unexpected side-effects
Хотя это не сильно отличается от передачи какого-либо объекта, состояние которого может измениться. позже, поскольку массив обычно (в случае вызова с несколькими аргументами вместо массива) является новым, созданным компилятором внутри, который вы можете безопасно использовать, это, безусловно, неожиданное поведение.