使用对象的字段过滤ArrayList

Aim*_*dou 15 java filtering arraylist guava

我有一个由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;}

}
Run Code Online (Sandbox Code Playgroud)

我想使用该desArt字段过滤我的List ,对于测试我使用了字符串"test".

我使用谷歌的Guava,它允许我过滤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")));
Run Code Online (Sandbox Code Playgroud)

但是这段代码不起作用.

Fre*_*ded 25

在Java 8中,使用过滤器

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


fge*_*fge 17

这是正常的:Predicates.containsPattern()CharSequences上运行,您的gestionStock.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();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后使用:

 private List<gestionstock.Article> filteredList
     = Lists.newArrayList(Collections2.filter(listArticles,     
         new ArticleFilter("test")));
Run Code Online (Sandbox Code Playgroud)

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


mon*_*ika 11

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

List<Article> secondList = new ArrayList<Article>();

for( Article a : listArticles) { 
// or equalsIgnoreCase or whatever your conditon is
if (a.getDesArt().equals("some String")) {
// do something 
secondList.add(a);
}
}
Run Code Online (Sandbox Code Playgroud)