You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 19:42:52