Сравнение элементов Groovy

#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 запросам, все кратко и приятно. Но нет.

  1. Каков идиоматический Groovy способ выполнения вышеописанного (подсчитать количество элементов, где x! = некоторый элемент)
  2. Почему это не работает?

Ответ №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. это кажется немного подробным для такого краткого языка, но оно вполне соответствует требованиям.