5

次の構造のすべての「名前」文字列要素を取得するにはどうすればよいですか。

class Foo {
    List<Bar> bars;
}

class Bar {
    private String name;
    private int age;
}

私のアプローチは次のとおりです。

List<String> names = new ArrayList<String>();

for (Bar bar : foo.getBars()) {
    names.add(bar.getName());
}

これはうまくいくかもしれませんが、Javaには何かありませんか。Collections私はこのように書くことができます: Collections.getAll(foo.getBars(), "name");?

4

4 に答える 4

3

Eclipse コレクションを使用し、getBars() を変更して MutableList などを返す場合は、次のように記述できます。

MutableList<String> names = foo.getBars().collect(new Function<Bar, String>()
{
    public String valueOf(Bar bar)
    {
        return bar.getName();
    }
});

関数を Bar の定数として抽出すると、次のように短縮されます。

MutableList<String> names = foo.getBars().collect(Bar.TO_NAME);

Java 8 ラムダでは、Function はまったく必要ありません。

MutableList<String> names = foo.getBars().collect(Bar::getName);

getBars() の戻り値の型を変更できない場合は、ListAdapter でラップできます。

MutableList<String> names = ListAdapter.adapt(foo.getBars()).collect(Bar.TO_NAME);

注:私は Eclipse コレクションのコミッターです。

于 2013-02-05T22:18:51.523 に答える
1

Googleグアバをある程度提供する

List<String> names = new ArrayList(Collections2.transform(foo.getBars(), new Function<Bar,String>() {
    String apply(Bar bar) {
        return bar.getName()
    }
});
于 2013-02-05T15:10:44.500 に答える
-1

Google のコレクション フレームワークが提供する MultiMap を使用できなかった理由はありますか?

マルチマップ

これにより、複数のキー値を持つマップが可能になります。

したがって、(ハッシュマップとは異なり) 重複したキーを持ち、そのキーのすべての値を返すことができます。

次に、関連する Map で get を呼び出すだけです。これは、予想される「getAll」の例と同じ実装になります。

得る

Collection get(@Nullable K key) キーに関連付けられたすべての値のコレクション ビューを返します。マルチマップ内のマッピングに指定されたキーがない場合、空のコレクションが返されます。返されたコレクションを変更すると、基になるマルチマップが更新され、その逆も同様です。

パラメータ: key - multimap で検索するキー 戻り値: キーがマップされる値のコレクション

于 2013-02-05T15:12:18.217 に答える