オブジェクトで満たされたArrayListがあります。
2つのフィールドを持つ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
フィールドを使用してリストをフィルタリングし、テストには文字列「test」を使用します。
Googleの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")));
しかし、このコードは機能していません。
これは正常です: Predicates.containsPattern() はCharSequence
sで動作しますが、これは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();
}
}
次に使用します:
private List<gestionstock.Article> filteredList
= Lists.newArrayList(Collections2.filter(listArticles,
new ArticleFilter("test")));
ただし、これは@mgnypで示されているように、非関数型プログラミングを使用してはるかに少ないコードで実行できる何かのかなりのコードです...
In Java 8、フィルターを使用
List<Article> articleList = new ArrayList<Article>();
List<Article> filteredArticleList= articleList.stream().filter(article -> article.getDesArt().contains("test")).collect(Collectors.toList());
Forループまたは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);
}
}
Guavaは、Javaで関数型プログラミングを使用できるライブラリです。関数型プログラミングでの成功の1つは、次のようなコレクション変換です。
コレクション-> op-> op-> op-> transformedCollection。
ここを見て:
Collection<Article> filtered = from(listArticles).filter(myPredicate1).filter(myPredicate2).filter(myPredicate3).toImmutableList();
きれいですね。
2つ目の利点は、ラムダ関数です。ここを見て:
Collection<Article> filtered = from(listArticles)
.filter((Predicate) (candidate) -> { return candidate.getCodeArt() > SOME_VALUE })
.toImmutableList();
実際、Javaにはまだ純粋なラムダ関数がありません。 Java 8でそれを行うことができます。しかし、今のところIDE Inellij Ideaでこれを書くことができ、IDEはそのようなラムダをオンザフライで作成されるPredicateに変換します:
Collection<Article> filtered = from(listArticles)
.filter(new Predicate<Article>() {
@Override
public boolean apply(Article candidate) {
return candidate.getCodeArt() > SOME_VALUE;
}
})
.toImmutableList();
フィルター条件に正規表現が必要な場合、コードはより複雑になり、条件を別のメソッドに移動するか、Predicate全体を別のクラスに移動する必要があります。
このすべての関数型プログラミングが複雑すぎると思われる場合は、新しいコレクションを作成し、手動で(グアバを使用せずに)入力してください。
List<Article> filtered = new ArrayList<Article>();
for(Article article : listArticles)
{
if(article.getCodeArt() > SOME_VALUE)
filtered.add(article);
}
グアバでは、次のようなCollections2.filterを使用するのがはるかに簡単だと思います。
Collections2.filter(YOUR_COLLECTION, new Predicate<YOUR_OBJECT>() {
@Override
public boolean apply(YOUR_OBJECT candidate) {
return SOME_ATTRIBUTE.equals(candidate.getAttribute());
}
});
これを試して:
private List<gestionstock.Article> listArticles = new ArrayList<>();
private List<gestionstock.Article> filteredList filteredList = Lists.newArrayList(Collections2.filter(listArticles, new Predicate<gestionstock.Article>(){
public boolean apply(gestationstock.Article article){
return article.getDesArt().contains("test")
}
}));
カスタムオブジェクトを使用しているため、独自の述語を実装する必要があります。他の場所で使用している場合は、ファイルで定義してください。そうでなければ、この実装はうまく機能します。