如何在groupBy中有两个事实得到计数的结果。
背景:
private Constraint exampleConstraint(ConstraintFactory constraintFactory) {
return constraintFactory
.from(Journey.class)
.filter((Journey1) -> journey1.isValid())
.join(Journey.class, Joiners.filtering((Journey1, Journey2) -> (
Journey2.getDayJava().equals(Journey1.getDayJava()) && Journey2.isValid()
)))
.groupBy((Journey1, Journey2) -> Journey2,
(Journey1,Journey2) -> ConstraintCollectors.count())
.penalizeConfigurable(MY_CONSTRAINT, (Journey2, resultOfCount) -> Journey2.getDelta() - resultOfCount);
}我的问题的样本:
.groupBy((journey1, journey2) -> journey2,
(journey1,journey2) -> ConstraintCollectors.count())第二个组返回一个org.optaplanner.core.api.score.stream.uni.UniConstraintCollector,但我需要一个int或Long。
谢谢
发布于 2022-08-30 10:44:47
您的代码片段显示了对此概念的误解。
首先,约束收集器不是用作组键,而是用作独立参数。第二,ConstraintCollectors.count()不适用于BiConstraintStream。为此,您必须使用ConstraintCollectors.countBi()。
综合起来,修正后的代码片段如下所示:
private Constraint exampleConstraint(ConstraintFactory constraintFactory) {
return constraintFactory
.from(Journey.class)
.filter((Journey1) -> journey1.isValid())
.join(Journey.class,
Joiners.filtering((Journey1, Journey2) ->
Journey2.getDayJava().equals(Journey1.getDayJava()) && Journey2.isValid()))
.groupBy((Journey1, Journey2) -> Journey2,
ConstraintCollectors.countBi())
.penalizeConfigurable(MY_CONSTRAINT, (Journey2, resultOfCount) -> Journey2.getDelta() - resultOfCount);
}然而,这里也存在着相当大的性能改进的潜力。filtering()合并器没有索引,有一种方法可以用完全索引操作替换它,如下所示:
private Constraint exampleConstraint(ConstraintFactory constraintFactory) {
return constraintFactory.from(Journey.class)
.filter(Journey::isValid)
.join(
constrainFactory.forEach(Journey.class)
.filter(Journey::isValid),
Joiners.equal(Journey::getDayJava))
.groupBy((Journey1, Journey2) -> Journey2,
ConstraintCollectors.countBi())
.penalizeConfigurable(MY_CONSTRAINT, (Journey2, resultOfCount) -> Journey2.getDelta() - resultOfCount);
}如你所见,我做了两件事:
equals()合并器替换了filtering()合并器的其余部分。。
这样,您应该从约束中获得最大的性能。
https://stackoverflow.com/questions/73540752
复制相似问题