2016-06-26 7 views
0

Javaコードを開発するときは、常にオブジェクトのリストからいくつかのプロパティを抽出する必要があります。javaいくつかのオブジェクトのリストからいくつかのプロパティを抽出する方法と、リファクタリングにもやさしい方法

List<Foo> fooList = ... 
List<Integer> idList = new ArrayList<>(); 
for(Foo f : fooList){ 
    idList.add(f.getId()); 
} 

本番環境では、我々はjava7を使用ので、私はこれを実装するためにjava8ストリームを使用することはできませんので。だから私はこの

public static <T, O> List<T> extract(Collection<O> collection, String propertyName) { 
    List<T> result = new ArrayList<>(collection.size()); 
    for (O o : collection) { 
     Object val = getFieldValue(propertyName, o); 
     result.add((T) val); 
    } 
    return result; 
} 

を実装するutilのコードを記述し、その後、私はちょうど

List<Integer> idList = extract(fooList,"id"); 

以下のようにこれを実装するが、私は例えば、プロパティ名を変更した場合には、リファクタリングするフレンドリーではありません。 id - > fooIdは、この変更を認識できません。

私はこの機能のリファクタリングを実装する方法を知りたいだけでなく、簡単に使いたいと思っていますか?

+1

正直言って、最初の通常のJava 7の方法は、ユーティリティクラスを使用するよりはるかにクリーンで読みやすいように見えます。いくつかのことはそのまま残す方が良いです。代わりに、実際のJava 8ストリームクラスを見て、それらのロジックを試して模倣することもできます。 –

+0

実際にこの一般性が必要ですか?このマッピング関数を使用しているプロパティの数はいくつですか? – Joffrey

答えて

3

は、Java 8を使用しない場合でも、あなたは次のように関数を使用して同じロジックを適用することができます。

public interface Function<T, R> { 
    /** 
    * Applies this function to the given argument. 
    * 
    * @param t the function argument 
    * @return the function result 
    */ 
    R apply(T t); 
} 

public static <T, O> List<T> extract(Collection<O> collection, Function<O, T> mapper) { 
    List<T> result = new ArrayList<>(collection.size()); 
    for (O o : collection) { 
     result.add(mapper.apply(o)); 
    } 
    return result; 
} 

実際の代わりString literalの機能を使用すると、リファクタリングがはるかに簡単とはるかにありオブジェクト指向。私はあなたがグアバの外観を持つことができると思い

List<Integer> idList = extract(fooList, new Function<Foo, Integer>() { 
    @Override 
    public Integer apply(final Foo f) { 
     return f.getId(); 
    } 
}); 
+0

私はこれを投稿しようとしていました:)おそらく、あなたはOPで興味を持っているものだと思うので、非java8環境(匿名クラスかもしれません)でこれを使う方法についての説明を追加できます。 – Joffrey

+0

@Joffreyの返答それはあなたが意味するものですか? –

+0

はい、正確です。私はこの記事の読者がこれを探していると思います。なぜなら、Java 8の 'Function'と' map() 'をコピー・ペーストするのは簡単ですが、呼び出し元コードを正しく取得するのは難しいからです。 – Joffrey

1

あなたのメソッド呼び出しは、そのようなものになります。 Guavaにはファンクションインタフェースがあり、 Collections2.transform(Collection<E>, Function<E,E2>)メソッドが必要な機能を提供します。以下は例です:

final Collection<Foo> fooList = ...; 
final Collection<Integer> idList = 
    Collections2.transform(fooList, new Function<Foo, Integer>(){ 

     @Override 
     public Integer apply(final Foo foo){ 
      return foo.getId(); 
     } 
    }); 
+0

ありがとうございますが、実際はあまりよくありません匿名のように、私はそれが直感的ではないと思います。そして、私は 'lambdaj'がもっと直感的であると思います。 'extract(fooList、on(Foo.class).getId());'しかし、そのソースコードは理解するのが少し難しいです。https://code.google.com/archive/p/lambdaj/wikis/LambdajFeaturesをご覧ください。 .wiki – zhuguowei

関連する問題