约束流–没有Drools规则语言的现代Java约束
傳統上,要使用OptaPlanner進行擴展,您必須學習DRL。 不再。 借助受Java 8 Streams和SQL啟發的新Constraints Streams API,您現在可以用Java (或Kotlin或Scala) 編寫約束,并且仍然可以從增量計算中受益。
在下面,約束流(CS)仍使用強大的Drools引擎。 我們也仍然完全支持得分DRL。 它們不被棄用。
讓我們從一個例子開始。 在護士排班中,為了避免將班次分配給員工Ann ,您可以在DRL中編寫以下約束:
rule "Don't assign Ann" when Shift(getEmployee().getName() == "Ann" ) then scoreHolder.addSoftConstraintMatch(kcontext, - 1 ); end這在使用約束流的Java中是相同的約束:
Constraint constraint = constraintFactory .from(Shift. class ) .filter(shift -> shift.getEmployee().getName().equals( "Ann" )) .penalize( "Don't assign Ann" , HardSoftScore.ONE_SOFT);如果您熟悉SQL或Java 8流,則應該看起來很熟悉。 給定一個有四個班次的潛在解決方案(其中兩個分配給Ann ),這些班次將通過約束流流動,如下所示:
這種寫約束的新方法有幾個好處:
增量計算
首先,與EasyScoreCalculator不同,約束流仍然像DRL一樣應用增量分數計算來進行橫向擴展。 例如,當一個移動將雇員換兩班時,僅計算增量。 這是巨大的可擴展性收益:
索引編制
當JOIN多個類型時,就像SQL JOIN運算符一樣,約束流在索引上應用哈希查找以更好地擴展:
IDE支持
因為ConstraintsStreams是用Java語言編寫的,所以它們背負了非常強大的工具支持。
代碼突出顯示,代碼完成和調試工作正常:
代碼突出顯示
IntelliJ IDEA Ultimate中的DRL代碼:
對于相同的約束,在IntelliJ IDEA Ultimate中使用約束流的Java代碼:
代碼完成
約束流的代碼完成:
當然,所有API方法都具有Javadocs。
調試
在ConstraintStream的filter()添加一個斷點:
在調試時診斷問題:
Java語法
用約束流用Java編寫的約束,無論好壞,都遵循Java語言規范(JLS)。 當使用來自Kotlin或Scala的約束流時,適用類似的邏輯。
在DRL和約束流之間遷移時,請注意DRL和Java之間的一些區別:
- DRL的==運算符在Java中轉換為equals() 。
- 除了getter,DRL還允許MVEL表達式轉換為Java中的getter。
例如,此DRL具有name和== :
rule "Don't assign Ann" when Employee(name == "Ann" ) then ... end但是,對于完全相同的約束,Java變量具有getName()和equals() :
constraintFactory.from(Employee. class ) .filter(employee -> employee.getName().equals( "Ann" )) .penalize( "Don't assign Ann" , ...);進階功能
Constraint Streams API使我們可以添加語法糖和強大的新概念,這些概念專門為幫助您構建復雜的約束而量身定制。
為了突出其中之一,讓我們看一下功能強大的groupBy方法:
與SQL GROUP BY運算符或Java 8 Stream Collector相似,它支持sum() , count() , countDistinct() , min() , max() , toList()甚至自定義函數,同樣也不會損失增量分數計算。
約束流的未來工作
首先,非常感謝Luká?Petrovicky在Constraints Streams上所做的所有工作!
但這僅僅是開始。 我們設想了更高級的功能,例如負載平衡/公平方法,以使此類約束更易于實現。
目前,我們的首要任務是簡化對隔離的單元測試的單元。 考慮測試驅動設計。 敬請關注!
翻譯自: https://www.javacodegeeks.com/2020/04/constraint-streams-modern-java-constraints-without-the-drools-rule-language.html
總結
以上是生活随笔為你收集整理的约束流–没有Drools规则语言的现代Java约束的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hibernate jpa_JPAHib
- 下一篇: 微软 365 Copilot AI 助手