Языки с замыканиями, такие как Ruby, позволяют элегантным конструкциям преобразовывать списки. Предположим, у нас есть класс
class QueryTerm {
String value;
public String getValue() {...}
}
и список терминов List<QueryTerm> terms
, которые мы хотим преобразовать в его список значений List<String> values
.
В Ruby мы могли бы написать что-то вроде:
values1 = terms.collect do |term|
term.getValue()
end
Java вынуждает нас создавать список результатов и самим проходить итерацию по коллекции терминов (по крайней мере, с тех пор, как был введен foreach), итератор или позиция индекса не задействованы:
Collection<String> values2 = new HashSet<String>();
for (QueryTerm term : terms) {
values2.add(term.getValue());
}
Apache Commons и Google Collections2 пытаются эмулировать замыкания в Java с помощью анонимных классов:
Collection<String> values3 = Collections2.transform(terms, new Function<QueryTerm, String>() {
@Override
public String apply(QueryTerm term) {
return term.getValue();
}
});
Странно то, что в этой версии больше строк кода и больше символов, чем в оригинальной версии! Я бы предположил, что по этой причине это сложнее понять. Поэтому я отклонил эту идею назад, когда увидел ее в Apache Commons. Однако, увидев его недавно в коллекциях Google, я начинаю задумываться, не упустил ли я что-то.
Поэтому мой вопрос: что вы думаете о конструкциях выше? Считаете ли вы версию Collections2.transform()
более читаемой / понятной, чем версия по умолчанию? Я что-то упустил полностью?
С наилучшими пожеланиями,
Johannes