如何创建特定对象变量的子列表?

时间:2013-04-08 09:13:39

标签: java gwt guava

如何使用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());
}

3 个答案:

答案 0 :(得分:4)

可以使用番石榴functional idioms你不应该。正如链接文档中所解释的那样:

  

过度使用Guava的函数式编程习语会导致冗长,混乱,不可读和低效的代码。这些是迄今为止最容易(也是最常见)被滥用的番石榴部分,当你为了制作你的代码而言,这是一个单线,&#34;番石榴队哭泣。

那里的例子与你的用例非常匹配,很好地表明&#34; functional&#34;代码的可读性会低得多。由于它也很可能效率较低,在这种情况下它实际上没有用处。

答案 1 :(得分: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类中的枚举 如果您稍后需要基于另一个属性(例如age

)进行转换,这将非常有用
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的评论所指出的那样,非番石榴方式更短,更易读。

答案 2 :(得分:1)

我更喜欢这个版本的@artfullyContrived解决方案。

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

此解决方案将所有与您的类相关的访问器方法组合在同一个位置 并帮助您编写更多功能代码,而不会出现冗长,混乱和不可读性。