首页 文章

了解Groovy中的findAll

提问于
浏览
1

请考虑以下代码:

String emptyString = '''

        '''
println "After trimming empty string has size: " + emptyString.trim().size()
println "Number of non empty elements in array: " + ([emptyString, 'kshitiz'].findAll({ it.trim() != 0}).size())

我希望输出为 1 . 但输出是:

After trimming empty string has size: 0
Number of non empty elements in array: 2

我怀疑我可能会遗漏一些基本的东西,但不能弄清楚是什么 .

2 回答

  • 1

    你的代码应该是:

    String emptyString = '''
    
        '''
     println "After trimming empty string has size: " + emptyString.trim().size()
     println "Number of non empty elements in array: " + ([emptyString, 'kshitiz'].findAll({ it.trim().length() != 0}).size())
    

    注意使用length()方法 . 你没有比较字符串的长度 .

  • 1

    闭包 {it.trim() != 0} 中的表达式对于两个列表条目都返回true,无论it.trim()返回的字符串是否为空,因此findAll不会过滤掉任何内容,并且findAll返回的列表大小为2 .

    修复如 {it.trim().length() != 0}{it.trim() != ''} (您可以在Groovy中执行,因为 == 使用equals方法)将起作用但不是必需的 . Groovy将空(零长度)字符串视为false和非空字符串为true,请参阅these examples from groovy-lang.org

    assert 'a'
    assert !''
    def nonEmpty = 'a'
    assert "$nonEmpty"
    def empty = ''
    assert !"$empty"
    

    删除适得其反的 != 0 给出

    ['', ' ', 'asdf'].findAll { it.trim() }.size()
    

    已成功过滤掉空条目,其结果为1 .

相关问题