什么是最紧凑的Groovy语句,它测试列表中的所有项目是否可以转换为长?

时间:2012-01-19 19:14:04

标签: groovy

我正在寻找一个简洁的表达式来评估列表中的所有项目是Longs还是可以转换为Longs。我正在寻找一个紧凑的表达式,但我更喜欢可读性而不仅仅是code golf

示例:

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

3 个答案:

答案 0 :(得分:5)

为了便于阅读,我会做类似的事情:

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])

答案 1 :(得分:4)

我可以在第一时间获得的最短时间是:

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

修改

@epidemian有最好的答案,可以通过在循环外移动try来缩短答案

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

答案 2 :(得分:4)

Groovy实际上有一个内置的String.isLong()方法,所以另一个(可怕的)简洁的答案是:

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

我只包括它,因为它太短了。