日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

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

發布時間:2023/12/3 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 约束流–没有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约束的全部內容,希望文章能夠幫你解決所遇到的問題。

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