2

これは私が持っているサンプルオブジェクトです

public class Dummy {
    private long id;
    private String name;
    /**
     * @return the id.
     */
    public long getId() {
        return id;
    }
    /**
     * @param id the id to set.
     */
    public void setId(long id) {
        this.id = id;
    }
    /**
     * @return the name.
     */
    public String getName() {
        return name;
    }
    /**
     * @param name the name to set.
     */
    public void setName(String name) {
        this.name = name;
    }

}

私の問題は、これらのオブジェクトのリストがあり、リスト内のそのオブジェクトに存在するIDのリストをフェッチする必要があることです。私はこれを簡単に行うことができます

List<Long> ids = Lists.newArrayList();
for(Dummy dummy: dummyList){
 ids.add(dummy.getId()); 
}

私が思いついたものが使用IterablesまたはCollectionsフィルタリングしているのではなく、(forループを使用する代わりに)別のアプローチを使用してそれを行うことができるかどうか疑問に思っていますか?

編集:私はそれが私が思いついたのとは異なる方法でどのように行われることができるかを知ることに興味があります。

4

3 に答える 3

14

グアバの使用

Iterables.transformインデックスの Iterable を取得するために使用できます。

List<Dummy> dummyList = Lists.newArrayList();
Iterable<Long> idList = Iterables.transform(dummyList, new Function<Dummy, Long>() {
    public Long apply(Dummy dummy) { return dummy.getId(); };
});

しかし、それは本当にやり過ぎのようです。1 行増えるだけで、読みやすさが失われます。

Java 8 の使用

Java 8以降、クロージャーがあり、これをより簡潔に書くことができます。

List<Long> idList = dummyList
            .stream()
            .map(Dummy::getId)
            .collect(Collectors.toList());
于 2013-03-14T18:10:39.657 に答える
2

完全を期すために:LambdaJワンライナーにするために使用することもできます:

List<Long> ids = extract(dummyList, on(Dummy.class).getId());

LambdaJのwikiで詳細を参照してください。

このソリューションはforループよりも見栄えがよいかもしれませんが、バックグラウンドでプロキシを使用するためパフォーマンスが大幅に低下するため、コードのパフォーマンスが重要な場合は使用しないことに注意してください。LambdaJによって発生したパフォーマンスペナルティに関する分析をここで参照してください。

于 2013-03-14T18:30:46.340 に答える
2

それを短くする方法はありません。それは、仕事を成し遂げるために必要な最小限の作業です。

多くの場所でそれを行っていることがわかった場合は、それからメソッドを作成します。

public static List<Long> getIds(final List<Dummy> dummyList)
{
    List<Long> ids = Lists.newArrayList();
    for(Dummy dummy: dummyList){
        ids.add(dummy.getId());   
    } 
}

その後:

List<Long> ids = getIds(dummyList);

編集:後で別の方法を見つけた場合は、メソッド本体を置き換えるだけで、「魔法のように」行っているすべての場所で新しいメソッドが使用されます。

于 2013-03-14T18:03:03.353 に答える