1

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

我的问题是,我想使用ANDOR运算符根据多个条件过滤列表,但我不知道该怎么做。

例如,目前我有以下表达式

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

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

请帮忙。

4

2 回答 2

4

have() 的返回类型有两种方法来执行这种链接:and(Matcher) 和 or(Matcher)。请参阅http://lambdaj.googlecode.com/svn/trunk/html/apidocs/ch/lambdaj/function/matcher/LambdaJMatcher.html

最好的问候,迪特里希

于 2013-10-07T05:20:38.217 回答
1

也许你可以使用Matchers.allOf,Matchers.anyOfMatchers.not表达你的逻辑。

请查看Hamcrest 教程

逻辑的

allOf - 如果所有匹配器都匹配,则匹配,短路(如 Java &&)

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;
    }
}
于 2013-09-13T10:08:36.177 回答