2012-02-24 11 views
10

Acabo de empezar a usar Drools (versión 5.1.0) así que tenga paciencia conmigo en caso de que esta pregunta ya haya sido respondida.Verifique el elemento específico en una lista en Drools

I tienen un objeto java.util.List que contiene objetos de tipo complejo A, con A como:

class A { 
    String name; 
    String Value;} 

La lista, así como sus elementos están en la memoria de trabajo del motor Drools. ¿Hay una manera fácil de activar una regla solo si el nombre y el valor de un elemento en la lista coinciden con valores específicos?

Actualmente, estoy usando una función autodefinida dentro de la regla Drools, que itera sobre la lista y devuelve verdadero si hay un elemento que coincida con la especificación; sin embargo, me pregunto si este es el uso más eficiente y fácil.

Respuesta

14

Si las instancias de A están en la memoria de trabajo como usted dice (escenario ideal), simplemente escribir la regla de usarlo:

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

colecciones Inserción (listas, árboles, etc.) en la memoria de trabajo es directamente no recomendado, porque son estructuras de datos abstractas sin ninguna semántica intrínseca adjunta. Pero supongamos que tiene una clase Person, que contiene una lista de direcciones, y desea ejecutar la regla para cada dirección en Montreal, Canadá, sin insertar las direcciones como facs. Se puede escribir:

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

Por último, si realmente desea utilizar la lista como un hecho (de nuevo, una mala práctica), puede hacer lo siguiente, pero tenga en cuenta que coincidirá con todas las listas en la memoria de trabajo :

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

+1 por darme una paliza con esencialmente la misma respuesta que estaba escribiendo. – mike9322

+0

Gracias por la respuesta – serena

+0

@Edson Tirelli ¿Cómo salgo de un bucle? Digamos que para cada dirección, tengo una función que me devuelve booleano; por lo tanto, hago 'Persona ($ direcciones: direcciones); $ a: Dirección() desde $ direcciones; eval ($ e.returnBoolean()); ' ' luego // hacer algo; ' Ahora si después de obtener el eval; si es verdad; 'hace algo' y luego quiero salir del círculo. ¿Cómo hago eso? – Kraken

Cuestiones relacionadas