什么';测试列表中的所有项是否可以转换为long的最紧凑的Groovy语句是什么?

什么';测试列表中的所有项是否可以转换为long的最紧凑的Groovy语句是什么?,groovy,Groovy,我正在寻找一个简洁的表达式来计算列表中的所有项是否都是long或是否可以转换为long。我在寻找一个简洁的表达式,但我更喜欢可读性而不是简单的 示例: assert expr([1,2,'3']) assert expr([1,'fish',3]) == false assert expr([null]) == false assert expr([' ', 17]) == false 在第一次尝试中,我能得到的最短时间是: def expr = { a -> a.inject([]

我正在寻找一个简洁的表达式来计算列表中的所有项是否都是long或是否可以转换为long。我在寻找一个简洁的表达式,但我更喜欢可读性而不是简单的

示例:

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

在第一次尝试中,我能得到的最短时间是:

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

为了便于阅读,我会做如下操作:

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

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

我之所以包含它,是因为它很短。

Groovy将成功地将上述所有数组转换为
long
数组。e、 g.
[null]只要[]
[null]
,只要[]是
[32,17]
(转换为ascii值)。。你的意思是测试数字的准确性吗?@paislee这与我回答问题时所问的完全不同,因为
[1,'fish',3]
会抛出一个异常,这与布尔值不同。+1回答得真不错。。。也设法得到了一个;-)回答很好,但要小心零!目前,
canbegins([0])
生成false。由于
Long.valueOf(it)
的返回值并不重要,您可以使用
each
更改
each
,并执行类似操作:
try{things.each{Long.valueOf(it)};true}catch(e){false}
或者,仅仅为了好玩,
try{things.each{Long.valueOf(it){1}catch(e){false}=DOr,确实:
尝试{!things*.toLong().any{it==null}}catch(e){false}
,但长度相同;-)也许它是一个较新的Groovy函数,因为我刚刚从GroovyConsole复制了我的测试代码
getLong
将给您假阴性,因为它将为任何
0
值返回false,如
“0”
。啊,是的。我还没有使用1.8。事实上,我刚刚检查过,
是长的
方法,所以它应该仍然有效。或者,
String.valueOf(it).long可能会产生问题。我想在上面的评论中写“$it”.isLong()。习惯的力量。我仍然无法解释为什么“$it”。long没有编译,但没什么大不了的。谢谢你的帮助。
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