Какое самое компактное выражение Groovy проверяет, что все элементы в списке могут быть преобразованы в длинные? - PullRequest
3 голосов
/ 19 января 2012

Я ищу краткое выражение для оценки того, являются ли все элементы в списке длинными или могут быть преобразованы в длинные.Я ищу компактное выражение, но я предпочитаю удобочитаемость, а не просто код гольф .

Примеры:

assert expr([1,2,'3'])
assert expr([1,'fish',3]) == false
assert expr([null]) == false
assert expr([' ', 17]) == false

Ответы [ 3 ]

5 голосов
/ 19 января 2012

Для удобства чтения я бы сделал что-то вроде:

def canBeLongs(things) {
    things.every { 
        try { Long.valueOf(it); true } 
        catch (e) { false }
    }
}

assert canBeLongs([1,2,'3'])
assert !canBeLongs([1,'fish',3])
assert !canBeLongs([null])
assert !canBeLongs([' ', 17])

Просто для lulz, это другое решение ужасно, но оно очень лаконично и охватывает все тестовые случаи:

def f(l) { l.join() ==~ /[0-9]*/ }

assert f([1,2,'3'])
assert !f([1,'fish',3])
assert !f([null])
assert !f([' ', 17])
4 голосов
/ 20 января 2012

На самом деле есть встроенный метод String.isLong() от Groovy, поэтому другой (ужасный) краткий ответ:

def canBeLongs(things) { things.every{ "$it".long } }

assert canBeLongs([1,2,'3'])
assert canBeLongs([1,'fish',3]) == false
assert canBeLongs([null]) == false
assert canBeLongs([' ', 17]) == false

Я включаю его только потому, что он такой короткий.

4 голосов
/ 19 января 2012

Самое короткое, что я могу получить с первого хода:

def expr = { a ->
  a.inject([]) { c, v -> 
    c << { try{ Long.valueOf(it); true } catch(e){ false } }( v )
  }.every()
}

Редактировать

@ Эпидемиан имеет лучший ответ, который можно сделать короче, переместив попытку за пределы цикла

def canBeLongs(things) {
  try { things.every { Long.valueOf(it) } }
  catch(e) { false }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...