#groovy #groovyshell
#groovy #groovyshell
Вопрос:
Это безумие или это Спарта?
groovy:000> b = [1,2,3,4]
===> [1, 2, 3, 4]
groovy:000> b.count { !it.equals(4) }
===> 0
groovy:000> b.count { !it == 4 }
===> 0
groovy:000> b.count { it == 4 }
===> 0
groovy:000> b.count { it == 1 }
===> 0
groovy:000> b[0]
===> 1
groovy:000> b.each { println it }
1
2
3
4
===> [1, 2, 3, 4]
groovy:000> print b.class
class java.util.ArrayList===> null
groovy:000> b.each { println it.class }
class java.lang.Integer
class java.lang.Integer
class java.lang.Integer
class java.lang.Integer
===> [1, 2, 3, 4]
groovy:000> 4.equals(b[3])
===> true
groovy:000>
Здесь я сталкиваюсь со случаем «неожиданных ожиданий». Groovy сообщает мне, что у меня есть ArrayList из целых чисел, и я ожидаю, что я смогу выполнять небольшие поисковые запросы, подобные приведенным выше 3 запросам, все кратко и приятно. Но нет.
- Каков идиоматический Groovy способ выполнения вышеописанного (подсчитать количество элементов, где x! = некоторый элемент)
- Почему это не работает?
Ответ №1:
имейте в виду, что сигнатура метода
public Number count(Closure closure)
поддерживается с версии Groovy 1.8.0 (текущая версия 1.7.10) — см. http://groovy.codehaus.org/groovy-jdk/java/util/Collection.html#count (groovy.lang.Закрытие)
До Groovy 1.8 приведенный выше код вызывал метод ‘count (значение объекта)’, который подсчитывает количество вхождений данного значения внутри коллекции. предоставление экземпляра закрытия в качестве фактического значения параметра приводит к результатам, описанным выше.
Комментарии:
1. кстати.: «!it == 4» всегда возвращает false и должно быть записано как «it != 4»
Ответ №2:
Каков идиоматический Groovy способ выполнения вышеописанного (подсчитать количество элементов, где x! = некоторый элемент)
Вот один из способов:
def list = [3, 5, 3]
def countElementsNotEqualTo3 = list.findAll{ it != 3 }.size()
assert countElementsNotEqualTo3 == 1
Комментарии:
1. это кажется немного подробным для такого краткого языка, но оно вполне соответствует требованиям.