0

List<String>Guavaを使用してすべてのnameプロパティのサブリストを簡単に作成するにはどうすればよいですか?

class Person {
  String name;
}


List<Person> persons;

//how can I replace the following using guava `com.google.common`?
List<String> results = new ArrayList<String>();
for (Person p : persons) {
   results.add(p.getName());
}
4

3 に答える 3

2

以下はあなたのためにそれを行います。

  List<String> names = Lists.transform(persons, new NameFunction());

NameFunction は次のとおりです。

class NameFunction implements Function<Person, String> {

    @Override
    @Nullable
    public String apply(@Nullable Person person) {
            return person.getName();
    }
 }

編集1:

@mmounirouの回答を組み込みます。

変換関数を Person クラス内の列挙型として定義します。これは、年齢などの別の属性に基づいて後で変換する必要がある場合に役立ちます。

class Person {
    String name;
    String age;

    Person(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    enum TransformerFunctions implements Function<Person, String> {

        NAME_FUNCTION {
            @Override
            @Nullable
            public String apply(@Nullable Person person) {
                return person.getName();
            }
        },
        AGE_FUNCTION {
            @Override
            @Nullable
            public String apply(@Nullable Person person) {
                return person.getAge();
            }
        };
    }

関数を使用する

 List<String> names = Lists.transform(people,Person.TransformerFunctions.NAME_FUNCTION);

しかし、@ogregoireのコメントが指摘しているように、グアバ以外の方法は短く、十分に読みやすいです。

于 2013-04-08T12:42:56.047 に答える
1

@artfullyContrived ソリューションのこのバージョンを好みます。

List<String> names = Lists.transform(persons, Person.Functs.getName());

このソリューションは、クラスに関連するすべてのアクセサー メソッドを同じ場所にグループ化し、冗長性、混乱、および読みやすさに陥ることなく、より機能的なコードを記述するのに役立ちます。

于 2013-04-08T13:49:30.617 に答える