2014-01-26 81 views
1

我有一個產品類,其字段名爲(字符串)代碼,(字符串)名稱,(雙)價格和(日期)到期每個自己的getter和setter方法。我有另一個類ListProduct包含名爲productList的字段列表。下面是一個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表達式或匿名方法的可重複使用的方法。

+0

什麼是'lProduct'在'新的ArrayList ()',和你有使用Java 8中的選項? – skiwi

+1

僅在Java 8中支持Lambdas。Java 8已經定義了[Predicate](http://download.java.net/jdk8/docs/api/javax/sql/rowset/Predicate.html)接口和[methods] (http://download.java.net/jdk8/docs/api/java/util/stream/Stream.html#filter-java.util.function.Predicate-)使用它來做你想做的。如果你不使用Java 8,那麼考慮使用Guava。 –

回答

2

將條件重構爲界面:

pubic 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()); 
    } 
}); 
+0

非常感謝我正在尋找的 – gihooh

+0

如何訪問其他類的ProductAccepter? – gihooh

+0

在另一個名爲ProductAccepter.java的文件中聲明ProductAccepter? '。它應該是一個普通的頂級類/接口。 – Bohemian

2

您可以使用番石榴和傳遞給該方法謂:

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 
    } 
}); 
+0

你能幫我一個忙嗎?請在產品到期時間與特定數據進行比較的情況下寫入。 – gihooh

+0

然後您必須用日期替換名稱並更改apply方法以比較日期。另外,所以不要使用Double來表示價格,使用BigDecimal,或者你會遇到一些問題 – Leo

+0

太糟糕了。java沒有一些東西比如靜態方法來檢索已知的類屬性。 JPA生成的元模型標準人工生成的東西必須生成:-( – Leo