1

ラムダジ式を使用して、特定の基準に基づいてリストをフィルタリングしています。一致を見つけるために、hamcrest マッチャが使用されています。

私の質問は、 ANDおよびOR演算子を使用して複数の条件に基づいてリストをフィルター処理したいのですが、その方法がわかりません。

たとえば、現在、私は以下の式を持っています

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

ここでは、getSubFleetCode() に基づいてリストをフィルタリングしました。式の作成方法がわからない getSubFleetCode() とともに別の基準を追加したいと思います。

助けてください。

4

2 に答える 2

4

having() の戻り値の型には、この種の連鎖を行うための 2 つのメソッドがあります。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

The 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 に答える