使用对象的字段过滤ArrayList

我有一个由Objects填充的ArrayList。

我的对象类名为Article ,有两个字段;

 public class Article { private int codeArt; private String desArt; public Article(int aInt, String string) { this.desArt = string; this.codeArt = aInt; } public int getCodeArt() {return codeArt; } public void setCodeArt(int codeArt) {this.codeArt = codeArt;} public String getDesArt() {return desArt;} public void setDesArt(String desArt) { this.desArt = desArt;} } 

我想使用desArt字段过滤我的List,而对于测试我使用String“test”。

我使用谷歌的Guava,它允许我过滤ArrayList。

这是我试过的代码:

 private List listArticles = new ArrayList(); //Here the I've filled my ArrayList private List filteredList filteredList = Lists.newArrayList(Collections2.filter(listArticles, Predicates.containsPattern("test"))); 

但是这段代码不起作用。

这是正常的: Predicates.containsPattern()在CharSequence运行,你的gestionStock.Article对象没有实现。

你需要编写自己的谓词:

 public final class ArticleFilter implements Predicate { private final Pattern pattern; public ArticleFilter(final String regex) { pattern = Pattern.compile(regex); } @Override public boolean apply(final gestionstock.Article input) { return pattern.matcher(input.getDesArt()).find(); } } 

然后使用:

  private List filteredList = Lists.newArrayList(Collections2.filter(listArticles, new ArticleFilter("test"))); 

但是,这是一些代码,可以使用非函数编程以更少的代码完成,如@mgnyp所示…

在Java 8中,使用filter

 List
articleList = new ArrayList
(); List
filteredArticleList= articleList.stream().filter(article -> article.getDesArt().contains("test")).collect(Collectors.toList());

您可以使用for循环或每个循环通过列表循环。 您想根据某些条件创建另一个列表吗? 这应该是我认为的。

 List
secondList = new ArrayList
(); for( Article a : listArticles) { // or equalsIgnoreCase or whatever your conditon is if (a.getDesArt().equals("some String")) { // do something secondList.add(a); } }

Guava是一个允许您在Java中使用一些函数式编程的库。 函数式编程中的一个成功之处就是集合转换

集合 – > op – > op – > op – > transformedCollection。

看这里:

 Collection
filtered = from(listArticles).filter(myPredicate1).filter(myPredicate2).filter(myPredicate3).toImmutableList();

它很漂亮,不是吗?

第二个获胜的东西是lambda函数。 看这里:

 Collection
filtered = from(listArticles) .filter((Predicate) (candidate) -> { return candidate.getCodeArt() > SOME_VALUE }) .toImmutableList();

实际上,Java还没有纯粹的lambda函数。 我们将能够在Java 8中完成它。但是现在我们可以在IDE Inellij Idea中编写它,IDE将这样的lambda转换为Predicate,即时创建:

 Collection
filtered = from(listArticles) .filter(new Predicate
() { @Override public boolean apply(Article candidate) { return candidate.getCodeArt() > SOME_VALUE; } }) .toImmutableList();

如果您的过滤条件需要regexp,则代码变得更加复杂,您需要将条件移动到单独的方法或将整个谓词移动到单独的类。

如果所有这些函数式编程看起来太复杂,只需创建新的集合并手动填充它(没有Guava):

 List
filtered = new ArrayList
(); for(Article article : listArticles) { if(article.getCodeArt() > SOME_VALUE) filtered.add(article); }

使用Guava,我会说到目前为止最简单的方法是使用Collections2.filter,例如:

 Collections2.filter(YOUR_COLLECTION, new Predicate() { @Override public boolean apply(YOUR_OBJECT candidate) { return SOME_ATTRIBUTE.equals(candidate.getAttribute()); } }); 

尝试这个:

 private List listArticles = new ArrayList<>(); private List filteredList filteredList = Lists.newArrayList(Collections2.filter(listArticles, new Predicate(){ public boolean apply(gestationstock.Article article){ return article.getDesArt().contains("test") } })); 

这个想法是因为你正在使用自定义对象,你应该实现自己的谓词。 如果您在其他任何地方使用它,请在文件中定义它,否则,此实现可以很好地工作。