如何使用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());
}
答案 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());
此解决方案将所有与您的类相关的访问器方法组合在同一个位置 并帮助您编写更多功能代码,而不会出现冗长,混乱和不可读性。