使用lambdaj按多个标准过滤

时间:2013-09-11 13:17:55

标签: java lambdaj

我正在使用lamdaj表达式根据特定条件过滤列表。 为了找到匹配器,正在使用hamcrest matcher。

我的问题是,我想使用 AND OR 运算符根据多个条件过滤列表,我不知道该怎么做。< / p>

例如, 目前我有以下表达

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

这里我根据getSubFleetCode()过滤了列表。我想添加另一个标准以及getSubFleetCode(),我不知道如何构造表达式。

请帮忙。

2 个答案:

答案 0 :(得分:4)

having()的返回类型有两种方法可以进行这种链接:和(Matcher)和/或(Matcher)。请参阅http://lambdaj.googlecode.com/svn/trunk/html/apidocs/ch/lambdaj/function/matcher/LambdaJMatcher.html

祝你好运, 迪特里希

答案 1 :(得分:1)

也许您可以使用Matchers.allOfMatchers.anyOfMatchers.not来表达您的逻辑。

请检查The Hamcrest Tutorial

  

逻辑

     

allOf - 匹配所有匹配器匹配,短路(如Java&amp;&amp;)

     

anyOf - 匹配任何匹配器匹配,短路(如Java ||)

     

not - 如果包装的匹配器不匹配则匹配,反之亦然

一个简单的样本:

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;
    }
}