在軟體開發中,我們經常需要應用一組規則或條件來過濾或處理資料。使用傳統的 if 和 else 語句管理這些規則可能會變得繁瑣且難以維護。規則引擎提供了一種更靈活、更有條理的方法來定義和執行這些規則。在本文中,我們將探討如何使用函數語言程式設計原理在 Java 中構建一個簡單的規則引擎。
先決條件
在我們深入構建規則引擎之前,讓我們先定義必要的元件:
規則:
規則表示我們想要評估的條件或標準。它由一個謂片語成,該謂詞確定給定物件是否滿足規則的標準(使用 Enum 或 Map<key,value> )(在本部分中我使用 enum)。
規則引擎:
規則引擎負責管理一組規則,並將它們應用於一組物件,根據定義的規則對物件進行過濾,並返回過濾結果。
目標物件:
我們將使用一個簡單的 Person 類作為示例物件,我們想使用規則對其進行過濾。它具有姓名和年齡等屬性。
構建規則引擎
讓我們開始一步一步構建我們的規則引擎:
定義規則:我們首先使用名為 Rule 的列舉來定義規則。列舉中的每個規則代表我們要評估的特定條件或標準。例如,在我們的程式碼中,我們定義了兩個規則:AGE_GREATER_THAN_30 和 NAME_STARTS_WITH_B。每個規則都有一個相應的謂詞,用於定義規則的條件。
import java.util.function.Predicate;
<font>//你可以有很多列舉來管理規則或條件<i> public enum Rule implements TestRule { AGE_GREATER_THAN_30(person -> person.getAge() > 30 ), NAME_STARTS_WITH_B(person -> person.getName().startsWith( "B" ));
private final Predicate<Person> predicate;
Rule(Predicate<Person> predicate) { this .predicate = predicate; }
public Predicate<Person> getPredicate () { return predicate; } }
|
建立規則引擎:
接下來,我們建立 RuleEngine 類。該類將負責規則的管理和執行。它維護一個規則列表,並提供新增新規則和根據這些規則過濾物件的方法。
實現過濾邏輯
在 RuleEngine 類的 filter 方法中,我們遍歷物件列表並使用 Java 8 Stream API 中的 allMatch 方法應用每條規則。此方法檢查給定物件的所有規則是否都透過。如果所有規則都透過,我們將該物件新增到過濾列表中。
public interface TestRule { <T> Predicate<T> getPredicate(); } import java.util.ArrayList; import java.util.List;
public class RuleEngine<T> { private List<TestRule> rules;
public RuleEngine() { this.rules = new ArrayList<>(); }
public void addRule(TestRule rule) { rules.add(rule); }
public List<T> filter(List<T> items) { List<T> filteredItems = new ArrayList<>(); for (T item : items) { if (rules.stream().allMatch(rule -> rule.getPredicate().test(item))) { filteredItems.add(item); } } return filteredItems; } } public class Person { private String name; private int age;
public Person(String name, int age) { this.name = name; this.age = age; }
public String getName() { return name; }
public int getAge() { return age; } }
|
最後
在主類中,我們演示了規則引擎的用法。我們建立了一個 Person 物件列表,並用兩條規則初始化了 RuleEngine:AGE_GREATER_THAN_30 和 NAME_STARTS_WITH_B。然後,我們呼叫規則引擎的過濾器方法,並將 Person 物件列表傳入。規則引擎會對每個人應用規則,並返回過濾後的列表。
最後,我們遍歷過濾後的列表,列印出符合指定規則的人名。
import java.util.List;
public class Main { public static void main(String[] args) { List<Person> people = List.of( new Person(<font>"Alice", 25), new Person("Bob", 31), new Person("Charlie", 35) );
RuleEngine<Person> ruleEngine = new RuleEngine<>(); ruleEngine.addRule(Rule.AGE_GREATER_THAN_30); ruleEngine.addRule(Rule.NAME_STARTS_WITH_B);
List<Person> filteredPeople = ruleEngine.filter(people);
//this part only print result <i> for (Person person : filteredPeople) { System.out.println(person.getName()); } } }
|
結論
在本文中,我們瞭解瞭如何用 Java 構建一個簡單的規則引擎。規則引擎允許我們使用謂詞定義規則,並將其應用於物件集合。利用函數語言程式設計原則,我們可以建立一個靈活、可擴充套件的規則引擎,並將其用於各種場景。
透過理解這裡介紹的概念和程式碼,您可以在此基礎上擴充套件,建立更復雜的規則引擎,以滿足您的特定需求。
https://github.com/KiaShamaei/ruleEngine