我在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/