2013-04-08 49 views
0

如何使用番石榴轻松创建所有name属性的子列表List<String>如何创建特定对象变量的子列表?

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()); 
} 
+0

保持您的代码原样。它足够短并且可读。 – 2013-04-08 11:15:30

+0

我知道,但这只是一个例子,我想应用它的情况更复杂,所以这有很大帮助。 – membersound 2013-04-08 17:49:01

回答

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的评论所指出的那样,非番石榴的方式更短且可读性足够。

+1

在谈论属性的函数/谓词时,我的个人偏好是一个与属性名称相同的公共静态final字段,可能包括“get/is”。所以“名称”功能将是“Person.NAME”或“Person.GET_NAME”。 – ColinD 2013-04-08 17:58:50

4

可以利用番石榴的functional idioms但是你不应该。由于对链接文档解释说:

过度使用番石榴的函数式编程成语的可导致冗长,混乱,不可读,和低效的代码。这是迄今为止番石榴最容易(也是最常见)被滥用的部分,当你为了使你的代码“成为一行”而荒谬绝伦时,Guava团队就会流泪。

这个例子非常符合你的用例,并很好地显示“功能性”代码的可读性会低得多。由于它也很可能效率较低,所以在这种情况下确实没有任何用处。

1

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

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

该解决方案组在同一个地方 关系到你的类的所有存取方法,帮助你写出更喜欢代码functionnal而不冗长,混乱和不可读性下降。

相关问题