如何使用lambdaj和hamcrest matcher(hasItemsInArray)过滤列表

时间:2012-10-30 17:35:12

标签: java predicate hamcrest lambdaj matcher

我正在尝试过滤通过lambdaj在供应商数组中找到的caroffers对象列表。但是下面的代码不起作用。我得到空名单。

    String[] vendor = {"FORD","TOYOTA"}; 
    List carsOffers=filter(having(on(CarProviderModel.class).getProviderName(),  hasItemInArray(vendor)),carprvds);

以下代码的作用。只有相同才能对我有用。

    List carsOffers=filter(having(on(CarProviderModel.class).getProviderName(),  anyOf(equalTo(vendor[0]), equalTo(vendor[1]))),carprvds);

请帮帮我。

1 个答案:

答案 0 :(得分:3)

您想要isIn

filter(having(on(CarProviderModel.class).getProviderName(), 
    isIn(vendor)),carprvds);

hasItemInArray与您想要的相反 - 而不是对getProviderName()vendor提供的列表之一的项目进行过滤,而是对项目进行过滤其中vendorgetProviderName()返回的项目之一 - 当然getProviderName()(大概是!)并没有返回数组,因此您没有匹配。

Hamcrest Matchers class documentation给出了两者的例子:

<强>伊辛

assertThat("foo", isIn(Arrays.asList("bar", "foo")))

<强> hasItemInArray

assertThat(new String[] {"foo", "bar"}, hasItemInArray(startsWith("ba")))

(注意,您的代码正在调用hasItemInArray的另一个重载,这相当于hasItemInArray(equalTo(vendor)) - 这可能会让您更清楚地知道您正在测试与{{1}的相等性收集)。