使用对象的字段过滤数组列表

2022-09-02 00:05:18

我有一个由对象填充的 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;}

}

我想使用字段过滤我的列表,对于测试,我使用了字符串“test”。desArt

我使用了谷歌的番石榴,它允许我过滤一个ArrayList。

这是我尝试过的代码:

private List<gestionstock.Article> listArticles = new ArrayList<>();

//Here the I've filled my ArrayList

private List<gestionstock.Article> filteredList filteredList = Lists.newArrayList(Collections2.filter(listArticles, Predicates.containsPattern("test")));

但是此代码不起作用。


答案 1

在 Java 8 中,使用过滤器

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

答案 2

这是正常的:谓词.containsPattern()对s进行操作,而您的对象没有实现。CharSequencegestionStock.Article

您需要编写自己的谓词:

public final class ArticleFilter
    implements Predicate<gestionstock.Article>
{
    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<gestionstock.Article> filteredList
     = Lists.newArrayList(Collections2.filter(listArticles,     
         new ArticleFilter("test")));

但是,对于可以使用非函数式编程的更少的代码,这是相当多的代码,如@mgnyp所示...