2013-09-11 3 views
1

Я использую выражения lamdaj для фильтрации списков на основе определенных критериев. Используется для поиска совпадений совпадений hamcrest.Фильтр по нескольким критериям, используя lambdaj

Мой вопрос, я хотел бы, чтобы отфильтровать список, основанный на более чем одно условие, используя И и ИЛИ оператора и я не знаю, как это сделать.

Например, На данный момент я нижеприведенного выражения

List<CheckPlanForecastData> filteredSubFleet = select(
          forecastList, 
          having(on(CheckPlanForecastData.class).getSubFleetCode(), 
          Matchers.equalTo(report.getSubFleet()))); 

Здесь я отфильтровали список, основанный на getSubFleetCode(). Я хотел бы добавить еще один критерий вместе с getSubFleetCode(), который я не знаю, как построить выражение.

Пожалуйста, помогите.

ответ

1

Возможно, вы можете использовать Matchers.allOf, Matchers.anyOf и Matchers.not, чтобы выразить свою логику.

Пожалуйста, проверьте The Hamcrest Tutorial.

Логическое

allOf - соответствует, если все matchers совпадают, короткие замыкания (например, Java & &)

anyOf - матчи, если какие-либо matchers совпадают, короткие замыкания (как Java ||)

нет - соответствует, если завернутый соединитель не соответствует, и наоборот

Простой пример:

import org.hamcrest.Matchers; 

import java.util.ArrayList; 
import java.util.List; 

import static ch.lambdaj.Lambda.having; 
import static ch.lambdaj.Lambda.on; 
import static ch.lambdaj.Lambda.select; 

public class TestLambdaJ { 

    public static void main(String[] args) { 
     List<Order> orders = new ArrayList<>(); 
     Order order1 = new Order(); 
     order1.addItem("Apple"); 
     order1.addItem("Banana"); 
     order1.addItem("Orange"); 
     orders.add(order1); 

     Order order2 = new Order(); 
     order2.addItem("Apple"); 
     order2.addItem("Cherry"); 
     order2.addItem("Strawberry"); 
     orders.add(order2); 

     Order order3 = new Order(); 
     order3.addItem("Olive"); 
     order3.addItem("Banana"); 
     order3.addItem("Strawberry"); 
     orders.add(order3); 

     List<Order> ordersWithApple = select(orders, 
       having(on(Order.class).getItems(), 
         Matchers.allOf(
           Matchers.hasItem("Apple"), 
           Matchers.hasItem("Banana")))); 
    } 
} 

class Order { 
    List<String> items = new ArrayList<>(); 

    public void addItem(String item) { 
     items.add(item); 
    } 

    public List<String> getItems() { 
     return items; 
    } 
} 
+0

Спасибо за ответ. Но я хотел бы фильтровать на основе нескольких критериев в одном заявлении. Например, в вашем примере у класса Order есть элементы переменной экземпляра, рассмотрите, есть ли у вас другая величина переменной экземпляра, тогда как вы будете фильтровать список по отношению к обеим переменным? – prabu

+0

@prabu Можете ли вы выразить свою логику таким образом: например, предположим, что у Ордена есть другая переменная, называемая ценой. 1, фильтр Заказы с использованием переменных элементов; 2, фильтр Заказы с использованием ценовой переменной; 3, присоедините результаты # 1 и # 2 вместе. – longhua

+0

Я сделал то же самое .. Спасибо за помощь – prabu

Смежные вопросы