能否不依赖groupBy()使用约束流收集器实现全局实体字段求和约束?
用OptaPlanner约束流实现全局字段求和约束
要实现对所有MeaningOfLife实例的字段总和约束,你可以利用约束流的groupBy方法结合聚合收集器,即使不需要分组也能完成全局求和。核心是使用无分组键的groupBy搭配对应类型的求和收集器来实现全局聚合。
正确的约束流实现代码如下:
constraintFactory .forEach(MeaningOfLife.class) .groupBy(Sum.ofInt(MeaningOfLife::getValue)) // 对所有实例的value字段求和 .penalize(HardSoftScore.ONE_SOFT, totalMeaning -> totalMeaning != 42 ? 1 : 0) .asConstraint("Meaning of life is always 42");
关键说明:
groupBy(Sum.ofInt(MeaningOfLife::getValue)):省略分组键参数后,会将所有MeaningOfLife实例作为一个全局组,通过Sum.ofInt收集器计算value字段的总和。penalize方法中,通过Lambda判断总和是否不等于42:返回1表示罚1个软分数,返回0则不罚分。
这种写法完全符合OptaPlanner约束流的推荐用法,可以替代临时的EasyScoreCalculator方案。
内容的提问来源于stack exchange,提问作者Erich Oliphant
相关产品推荐
相关产品推荐

