Groovy Элемент сравнения - PullRequest
1 голос
/ 26 апреля 2011

Это безумие или это Спарта?

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 из Integer, и я ожидаю, что у меня будет возможность выполнять милые маленькие поиски, такие как вышеупомянутые 3 запроса, все лаконично и лаконично. Но нет.

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

Ответы [ 2 ]

3 голосов
/ 26 апреля 2011

Что такое идиоматический Groovy способ сделать это (сосчитать количество элементов, где x! = Некоторый элемент)

Вот один из способов:

def list = [3, 5, 3]

def countElementsNotEqualTo3 = list.findAll{ it != 3 }.size()
assert countElementsNotEqualTo3 == 1
3 голосов
/ 26 апреля 2011

помните, что метод подписи

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.Closure)

До Groovy 1.8 приведенный выше код вызывает метод count (Object value), который подсчитывает количество вхождений данного значения в коллекцию. предоставление экземпляра замыкания в качестве фактического параметра 'value' приводит к результатам, описанным выше.

...