关于OptaPlanner中@PlanningPin、空实体与.fromUniquePair()、.join()方法的技术咨询
OptaPlanner中固定/空实体与流API的处理逻辑解答
嘿,针对你在OptaPlanner流API里遇到的from()、fromUniquePair()和join()相关的固定/空实体问题,咱们一步步捋清楚:
一、fromUniquePair()是否会传播空且固定的实体?
默认情况下,fromUniquePair()遵循和from()一样的过滤规则:只会包含已初始化(非null)且非固定(not pinned)的实体。所以空的实体或者被固定的实体,默认不会进入fromUniquePair()的下游流。
如果想要让空且固定的实体也被纳入uniquePair的处理,你需要结合fromUnfiltered()来构建流,示例代码如下:
// 包含所有实体(包括空、固定的)来生成唯一配对 fromUnfiltered(YourEntity.class) .uniquePair() // 后续的流操作...
或者也可以在fromUniquePair中显式指定不过滤的连接条件:
fromUniquePair(YourEntity.class, Joiners.unfiltered()) // 后续的流操作...
二、fromUnfiltered()与join()结合时,第二个类的空/固定实体是否会被纳入?
答案是:默认不会。因为join()中第二个数据源的默认行为和from()一致——只包含已初始化且非固定的实体。fromUnfiltered()仅作用于当前的第一个数据源,不会自动影响join()里的第二个数据源。
如果想要第二个类的空/固定实体也被纳入关联逻辑,你需要给第二个数据源也使用fromUnfiltered(),示例代码如下:
// 两个数据源都显式使用fromUnfiltered,确保空、固定实体被纳入 fromUnfiltered(FirstEntity.class) .join(fromUnfiltered(SecondEntity.class), Joiners.equal(FirstEntity::getSomeField, SecondEntity::getMatchingField)) // 后续的流操作...
补充说明:OptaPlanner流API的默认过滤规则
OptaPlanner的流API中,from()方法默认会过滤掉两类实体:
- 未初始化的
null实体 - 通过
isPinned()方法返回true的固定实体
而fromUnfiltered()则会完全跳过这个过滤步骤,把所有符合类型的实体都纳入流中,不管其状态如何。
内容的提问来源于stack exchange,提问作者Loïc
相关产品推荐
相关产品推荐

