2012-02-24 22 views
10

Tôi vừa mới bắt đầu sử dụng Drools (phiên bản 5.1.0), vì vậy, vui lòng liên hệ với tôi trong trường hợp câu hỏi này đã được trả lời.Kiểm tra yếu tố cụ thể trong danh sách trong Drools

Tôi có một đối tượng java.util.List mà chứa các đối tượng phức tạp loại A, với A như:

class A { 
    String name; 
    String Value;} 

Danh sách này cũng như các yếu tố của nó là trong bộ nhớ làm việc của động cơ Drools. Có cách nào dễ dàng để kích hoạt quy tắc chỉ khi tên và giá trị của một phần tử trong danh sách phù hợp với các giá trị cụ thể không?

Hiện tại, tôi đang sử dụng hàm tự định nghĩa bên trong quy tắc Drools, lặp lại danh sách và trả về true nếu có phần tử khớp với đặc tả, tuy nhiên tôi tự hỏi đây có phải là cách hiệu quả nhất và dễ sử dụng nhất hay không.

Trả lời

14

Nếu các trường hợp A là trong bộ nhớ làm việc như bạn nói (kịch bản lý tưởng), chỉ cần viết các quy tắc sử dụng nó:

rule X 
when 
    A(name == "bob", value == 10) 
... 

bộ sưu tập Chèn (danh sách, cây, vv) vào bộ nhớ làm việc trực tiếp là không được khuyến khích, bởi vì chúng là các cấu trúc dữ liệu trừu tượng mà không có bất kỳ ngữ nghĩa nội tại nào được đính kèm. Nhưng cho phép nói rằng bạn có một lớp Person, có chứa một danh sách các địa chỉ, và bạn muốn thực thi quy tắc cho mỗi địa chỉ ở Montreal, Canada, mà không cần chèn các địa chỉ như là các mặt. Bạn có thể viết:

rule X 
when 
    Person($addresses : addresses) 
    Address(city == "Montreal", country == "CA") from $addresses 
... 

Cuối cùng, nếu bạn thực sự muốn sử dụng danh sách chính nó như là một thực tế (một lần nữa, thực tế xấu), bạn có thể làm những điều sau đây, nhưng lưu ý rằng nó sẽ phù hợp với tất cả các danh sách trong bộ nhớ làm việc :

rule X 
when 
    $list : List() 
    A(name == "bob", value == 10) from $list 
... 
+1

+1 để đánh tôi với cú pháp về cơ bản cùng một câu trả lời tôi đang ở giữa văn bản. – mike9322

+0

Cảm ơn bạn đã trả lời – serena

+0

@Edson Tirelli Làm cách nào để thoát khỏi vòng lặp. Nói cho từng Địa chỉ, tôi có một hàm trả về boolean; do đó tôi làm 'Người (địa chỉ $: địa chỉ); $ a: Địa chỉ() từ $ địa chỉ; eval ($ e.returnBoolean()); ' ' sau đó // làm điều gì đó; ' Bây giờ nếu sau khi nhận được eval; Nếu đó là sự thật; nó 'làm một cái gì đó' và sau đó tôi wan để có được ra khỏi vòng lặp. Làm thế nào để tôi đi về điều đó? – Kraken

Các vấn đề liên quan