3

すべて同じオブジェクト タイプのオブジェクトのコレクションがあります。その型の中には、アクセスしたい属性があります。この場合は、それをカンマ区切りのリストに追加します。

String sep = ", ";
List<Item> items = db.findItems();

for (Item item : items) 
{
    result.append(item.getDescription() + sep);
} //for

return result.substring(0, results.length - sep.length());

コレクション内のすべてのオブジェクトからその属性に直接アクセスして、Google Guava の Joiner 関数を呼び出すことができればよいのですが。

return Joiner.on(", ").join(/*Description attribute collection here*/);

私が考えている構造の種類は、各列が属性を表し、各行がオブジェクトを表す2D配列のようなものであるため、オブジェクトを返す特定の行または特定の列(属性)を呼び出すことができるようにしたいすべてのオブジェクトから属性のコレクションを返します。

Java または優れたサードパーティは、このようなデータ構造を持っていますか?それとも独自に作成する必要がありますか?

乾杯、

アレクセイ・ブルー。

4

4 に答える 4

5

では、Google の Guava を最大限に活用してみてはいかがでしょうか。

Joiner.on(",").join(Collections2.transform(items, new Function<Item, String>() {
    public String apply(Item input) {
        return item.getDescription();
    }
}));
于 2012-05-10T12:19:51.387 に答える
2

Iterableコレクション内の各オブジェクトに到達し、正しい属性を発行する内部サブクラスを作成できます。@Hiery の応答を参照してください。彼はより速くコードに到達しました...

于 2012-05-10T12:16:25.680 に答える
2

ラムダ式とメソッド参照を備えたJDK 8で近日公開予定

List<Jedi> jedis = asList(new Jedi("Obiwan",80), new Jedi("Luke", 35));
List<String> jediNames = jedis.map(Jedi::getName).into(new ArrayList<>()); //with metdod ref
Iterable<Integer> jediAges = jedis.map(j -> j.getAge()); //with lambdas

何をしているかによっては、リンクで提供されている JDK 8 プレビューを使用することもできます。

あるいは、ライブラリLambdajがそれを行う方法を提供します。

于 2012-05-10T12:29:44.377 に答える
0

ばかげていますが、私は Item.toString() を選びます。join(map)できるようにマップはありませんか?

于 2012-05-10T12:16:56.350 に答える