我目前面临一个问题,我有一个约束,其中我必须计算孔解决方案的一个值,但它取决于 A 类型的所有规划实体。因此,如果其中一个发生更改,我必须为整个解决方案重新计算它实体。 所以选择一次计划实体列表并进行一次计算会更高效。
而不是 foreach 并将它们分组并针对每个实体之外的所有其他实体进行计算..
我查看了约束工厂和流,但没有找到解决方案。我尝试 foreach(ClassA.class).map(...) 并尝试使用 forEach(PlanningSolution) 并获取规划实体 A 的列表 - 但它不起作用。
有我可以使用的选择器或技巧吗?例如。
constraintFactory.forAll(PlanningEntityA.class).penalizeConfigurable(Calculation)
考虑使用
groupBy()
:
forEach(MyClass.class)
.groupBy(MyCustomCollector.class)
.penalize(...)
在这种情况下,MyCustomCollector
需要是UniConstraintCollector
的实现;希望界面是自我描述的。
还有一个预构建的收集器
ConstraintCollectors.toList()
,它将所有实例收集到一个列表中并将其传递给penalize
。但是,我强烈建议不要使用它,因为这将导致每次任何实体更改时都会处理整个列表,因此随着数据集大小的增加,求解器的扩展性会很差。
UniConstraintCollector
的要点是让您能够增量地实现计算 - 仅根据一个实体的变化增量地更改结果,而不是每次发生任何变化时重新计算整个数据集。