Groovy中的复杂过滤逻辑findAll闭包

时间:2018-04-10 09:47:18

标签: groovy closures

Groovy在这里。我需要使用一些复杂的逻辑来过滤Set个POGO,而我正在努力理解正确使用findAll闭包。

@Canonical
class Widget {
    String name
    Boolean fizzbuzz
}

...

Set<Widget> filter(Integer isHidden, Set<Widget> inputWidgets) {
    inputWidgets.findAll { widget ->
        Foobar foobar = FoobarHelper.getFoobarByWidget(widget)

        // Logic:
        // If isHidden is 0 and no foorbar exists for the given widget,
        // then we want to add this widget to the collection being
        // returned...
        if(isHidden.intValue() == 0 && !foobar) {
            // Add this widget to collection being returned
            ???
        }

        // ...but if isHidden is 1 and a foobar does exist for the given
        // widget, then we want to add this widget to the collection as
        // well.
        else if(isHidden.intValue() == 1 && foobar) {
            // Add this widget to collection being returned
            ???
        }
    }
}

再次,过滤逻辑是:

  • 如果isHidden == 0FoobarHelper.getFoobarByWidget(...)返回null,则将当前widget添加到要返回的集合中;和
  • 如果isHidden == 1FoobarHelper.getFoobarByWidget(...)返回非null,则将当前widget添加到要返回的集合中

认为我的逻辑实现是正确的,我只是在努力解决如何将当前widget添加到返回集合(其中???是)。 有什么想法吗?

1 个答案:

答案 0 :(得分:1)

似乎应该只是:

@Canonical
class Widget {
    String name
    Boolean fizzbuzz
}

...

Set<Widget> filter(Integer isHidden, Set<Widget> inputWidgets) {
    inputWidgets.findAll { widget ->
        Foobar foobar = FoobarHelper.getFoobarByWidget(widget)
        (isHidden.intValue() == 0 && !foobar) || (isHidden.intValue() == 1 && foobar)
    }
}

在这一行中:

(isHidden.intValue() == 0 && !foobar) || (isHidden.intValue() == 1 && foobar)

你正在检查这两个条件。满足其中任何一个的所有元素都将添加到返回的集合中。