可重复使用的搜索方法

时间:2014-01-26 13:23:01

标签: java search

我有一个Product类,其中包含名为(String)代码,(String)名称,(Double)价格和(Date)到期的字段以及每个自己的getter和setter方法。我有另一个类ListProduct,它包含一个名为productList的字段List。下面是一个ListProduct类,我创建了一个方法,用于返回仅按产品名称搜索的所有产品。

public List<Product> SearchItemByName(ListProduct list,
        String name) {

    List<Product> products = new ArrayList<Product>();
    for (Product prod : list.productList) {

        if (prod.getName().toLowerCase().contains(name.toLowerCase())) {
            products.add(prod);
        }
    }
    return products;
}

我需要知道的是如何使上面的可重用方法不仅可以通过名称搜索列表,例如使用lambda表达式或匿名方法。

2 个答案:

答案 0 :(得分:2)

你可以使用Guava并传递给这个方法Predicate:

new Predicate<Product>() {
    @Override
    public boolean apply(Product input) {
        // here check for desired conditions
    }
};

然后您可以使用Iterables过滤您的收藏:

return Iterables.filter(productList, predicate);

所以你的方法看起来像是:

public List<Product> SearchItemByName(ListProduct list, Predicate<Product> predicate) {
        return Lists.newArrayList(Iterables.filter(list.productList, predicate));
}

searchItemByName(list, new Predicate<Product>() {
    @Override
    public boolean apply(Product input) {
        // here check for desired conditions
    }
});

答案 1 :(得分:2)

将条件重构为接口:

public interface ProductAccepter {
   public boolean accept(Product product);
}

public List<Product> searchItem(ListProduct list, ProductAccepter accepter) {
    List<Product> products = new ArrayList<Product>();
    for (Product prod : list.productList) {
        if (accepter.accept(prod))
            products.add(prod);
        }
    }
    return products;
}

然后要调用它,您可以使用匿名类:

final String name = "foo";
List<Product> products = searchItem(list, new ProductAccepter() {
    public boolean accept(Product product) {
        return product.getName().toLowerCase().contains(name.toLowerCase());
    }
});