我正在使用lamdaj表达式根据特定条件过滤列表。 为了找到匹配器,正在使用hamcrest matcher。
我的问题是,我想使用 AND 和 OR 运算符根据多个条件过滤列表,我不知道该怎么做。< / p>
例如, 目前我有以下表达
List<CheckPlanForecastData> filteredSubFleet = select(
forecastList,
having(on(CheckPlanForecastData.class).getSubFleetCode(),
Matchers.equalTo(report.getSubFleet())));
这里我根据getSubFleetCode()过滤了列表。我想添加另一个标准以及getSubFleetCode(),我不知道如何构造表达式。
请帮忙。
答案 0 :(得分:4)
having()的返回类型有两种方法可以进行这种链接:和(Matcher)和/或(Matcher)。请参阅http://lambdaj.googlecode.com/svn/trunk/html/apidocs/ch/lambdaj/function/matcher/LambdaJMatcher.html。
祝你好运, 迪特里希
答案 1 :(得分:1)
也许您可以使用Matchers.allOf
,Matchers.anyOf
和Matchers.not
来表达您的逻辑。
逻辑
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;
}
}