0

如何使用 Guava轻松创建List<String>所有属性的子列表?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

4

可以使用番石榴的功能性习语你不应该。如链接文档中所述:

过度使用 Guava 的函数式编程习惯会导致冗长、混乱、不可读和低效的代码。到目前为止,这些是 Guava 中最容易(也是最常见)被滥用的部分,当你不遗余力地让你的代码“单行”时,Guava 团队会哭泣。

那里的示例与您的用例非常匹配,并且很好地表明“功能”代码的可读性要低得多。由于它也很可能效率较低,因此在这种情况下它真的没有用。

于 2013-04-08T09:21:30.693 回答
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 回答