【问题标题】:Groovy String concatenation with null checks带有空检查的 Groovy 字符串连接
【发布时间】:2023-03-07 11:19:01
【问题描述】:

有没有更好的方法来做到这一点?注意:part1part2part3 是在别处定义的字符串变量(它们可以为空)。

def list = [part1, part2, part3]
list.removeAll([null])
def ans = list.join()

所需的结果是一个包含空值的串联字符串。

【问题讨论】:

  • 您可以将其全部打包成一行:def ans = [part1, part2, part3].removeAll([null]).join(),但我不确定您所说的“更好”是不是这个意思。
  • @cdeszaq 这可能会更好,但它不起作用。 removeAll() 方法返回一个布尔值,而 join() 不能在布尔值上调用。

标签: string groovy null concatenation


【解决方案1】:

你可以这样做:

def ans = [part1, part2, part3].findAll({it != null}).join()

可能可以将关闭缩小到仅{it},具体取决于您的列表项将如何根据Groovy Truth 进行评估,但这应该会使其更紧密。

注意:GDK javadocs 是一个很棒的资源。

【讨论】:

  • 也可以使用.findAll({it?.trim()}) 来排除空字符串和空字符串。
【解决方案2】:

如果您使用不带参数的findAll。它将返回每个“真实”值,所以这应该有效:

def ans = [part1, part2, part3].findAll().join()

请注意,findAll 将过滤掉空字符串(因为它们在布尔上下文中被评估为 false),但在这种情况下并不重要,因为空字符串不会向 join() 添加任何内容: )

如果这是一个简化的问题并且您想保留空字符串值,您可以使用findResults{ it }

【讨论】:

  • 这与我的回答基本相同,只是确认了findAll 的工作原理,对吧?
  • 它还删除了传递给findAll 的闭包并提到了findResults,这可能对其他情况有用。
  • 好点。 findResults 具有在过滤时转换事物的出色能力。 +1
  • 我喜欢这样,但对我来说失败了。我使用的是 Groovy 1.7.10,当数组元素之一为空时 findAll() 方法会抛出错误。
  • @Ryan 是的,文档说 niladic findAll 是在 Groovy 1.8.1 中添加的
【解决方案3】:

或者,您可以使用 inject 将其作为折叠操作:

def ans = [part1, part2, part3].inject('') { result, element -> 
    result + (element ?: '')
}

这会迭代整个列表并将每个连续元素连接到一个结果,逻辑上将空字符串用于空元素。

【讨论】:

  • +1 Inject 是一种比我的答案更强大的方法。不过它可能有点复杂,也更难理解。
【解决方案4】:

你可以使用grep:

groovy:000> list = ['a', 'b', null, 'c']
===> [a, b, null, c]
groovy:000> list.grep {it != null}.join()
===> abc

【讨论】:

  • 您也可以只使用.grep(),因为它默认使用Groovy Truth 作为过滤器,但这与使用findAll() 相同。
猜你喜欢
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
  • 2014-08-12
  • 1970-01-01
  • 2020-06-03
  • 2012-07-06
相关资源
最近更新 更多