如何只将非空项添加到Groovy中的列表

The*_*ech 4 groovy

我想将非空项添加到List.所以我这样做:

List<Foo> foos = []
Foo foo = makeFoo()
if (foo)
    foos << foo
Run Code Online (Sandbox Code Playgroud)

但是有没有办法在单个操作中完成它(在创建列表后不使用findAll).喜欢:

foos.addNonNull(makeFoo())
Run Code Online (Sandbox Code Playgroud)

ata*_*lor 10

另一种方法是使用短路表达式:

foo && foos << foo
Run Code Online (Sandbox Code Playgroud)

对于foo要评估的第二部分,变量必须求值为true.这是一些其他语言的常见做法,但由于可读性问题和惯例,我不愿意在groovy中广泛使用它.

  • 同样,由于常规事实,这可能会跳过您想要添加的空/零值 (2认同)
  • 好点子。`foo != null &amp;&amp; foos &lt;&lt; foo` 如果你想在你的列表中出现假值。 (2认同)

tim*_*tes 5

不,你需要使用if,或编写自己的addNonNull方法(只使用一个if)

也:

if( foo ) {
Run Code Online (Sandbox Code Playgroud)

可能是不够的,因为这将跳过空字符串,或者0如果它返回整数

你需要

if( foo != null ) {
Run Code Online (Sandbox Code Playgroud)


use*_*001 5

答案是肯定的!我们可以摆脱分配变量

Foo foo = makeFoo()//we can ditch this
Run Code Online (Sandbox Code Playgroud)

答案是否定的,我们无法摆脱这种状况。但我们可以让它更紧凑。

就是这样

List<Foo> foos = []
foos += (makeFoo()?:[]);
Run Code Online (Sandbox Code Playgroud)

诀窍是 groovy 的“+”运算符,它根据“+”左边和右边的内容而工作不同。碰巧的是,如果左边是一个列表,右边是一个空列表,则不会向左边的列表添加任何内容。

优点是打字速度快且紧凑。

缺点是大多数人发生的情况并不是立即显而易见的,而且我们用额外的操作替换了变量赋值。无论如何,Groovy 都会尝试对 List foos 做一些事情,恰好在第二种情况下,该操作的结果给了我们期望的结果。