我在java中找到了解决方案的示例:

things.stream()


。过滤(
filterCollection.stream()。reduce(Predicate :: or).orElse(t-> true)
);

我试图使用groovy(v2.5.4)重写它:

List<System> systems = ... //load from db
WellApplicationType appType = params['appType']
Contract contract = params['contract']
List<Predicate> filterCollection = []

if (appType != null)
    filterCollection.add({SystemRunlife systemRl -> systemRl.getApplicationType() == appType })
if (contract != null)
    filterCollection.add({SystemRunlife systemRl -> systemRl.getContract() == contract})

...

systems.stream()
       .map{system -> system.getSystemRunlife()}
       .filter(filterCollection.stream().reduce{Predicate.&and}.orElse{t -> false})


仅当我在谓词列表中有1个元素时,它才起作用。如果我有更多的东西,那么我会报错:


没有方法签名:Script1 $ _run_closure3 $ _closure5.doCall()是
适用于参数类型:(Script1 $ _run_closure1,
Script1 $ _run_closure2)值:[Script1 $ _run_closure1 @ 7d9367fa,
Script1 $ _run_closure2 @ 70c1c430]可能的解决方案:doCall(),
doCall(java.lang.Object),findAll(),findAll()


有人可以告诉我哪里有问题吗?

UPD:

.filter{systemRl -> filterCollection.stream().allMatch{p -> p.test(systemRl)}}


-也不行。


没有方法签名:Script1.test()适用于参数
类型:(com.borets.wedb.entity.SystemRunlife)值:
[com.borets.wedb.entity.SystemRunlife-5c0d826a-7f63-1ef5-7b74-bde707a1d814
[新]]

最佳答案

Predicate<SystemRunlife> filter = { systemRl -> true }
for (Predicate<SystemRunlife> systemRunlifePredicate : filterCollection) {
    filter = (filter & systemRunlifePredicate)
}


我以这种方式组合了谓词。也许有人可以提出更多建议。

关于java - 将少量谓词应用于groovy中的流过滤器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59179251/

10-13 04:59