Для прикладу, необхідно отримати список із значень певного поля кожного елементу списку. Спочатку, я писав доволі простий і зрозумілий код, ясно ще під впливом Java:
List names = []
for (Person person : persons) {
names << person.firstName
}
З часом я удосконалювався і коду ставало менше:
def names = []
persons.each { names << it.firstName }
Виглядає дуже навіть зрозуміло, пишеться швидко і ще швидше читається.
Але і це не був край досконалості, і трохи пізніше я почав писати вже:
def names = persons.collect { it.firstName }
І цей кусок коду поражав мене тим, що був тільки 1 рядок, назва методу collect є зрозумілішою, ніж each у цьому конкретному випадку. І так, може, і писав би й дальше, якби не вирішив спробувати використати для цього spread оператора (*.). І тепер коду стало ще менше:
def names = persons*.firstName
Відмінністю від collect є не тільки простота написання, але і краща швидкодія.
І ось, в процесі написанні цієї статті, я відкрив для себе ще один спосіб. Коли починав писати цю статтю кілька хвилин тому, я вже не вірив, що може бути щось простіше, ніж використання spread оператора для вирішення моєї задачі. Але як виявилося, для отримання значення полів, використовувати spread оператор не є необхідним, і можна написати банально і просто:
def names = persons.firstName
Тож сиджу і думаю, а як можна ще простіше. Боюся зарікатися, що простіше вже бути не може, як вже зрозумів свою помилку кілька хвилин тому.
Groovy цікава мова, з якою все простіше і веселіше. Тож копати в Groovy, Python чи Ruby!
No comments:
Post a Comment