日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

drools 规则流_约束流–没有Drools规则语言的现代Java约束

發布時間:2023/12/3 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 drools 规则流_约束流–没有Drools规则语言的现代Java约束 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

drools 規則流

傳統上,要使用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 規則流

總結

以上是生活随笔為你收集整理的drools 规则流_约束流–没有Drools规则语言的现代Java约束的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。