Create a list of values from getters of a List of objects
java, list
Solution
You could use Guava's `Lists.transform`:
Function<Baby, String> getBabyNameFunction = new Function<Baby, String>() {
@Override
public String apply(Baby baby) {
return baby.getName();
}
};
List<String> babyNames = Lists.transform(babies, getBabyNameFunction);
The key difference here being that `babyNames` is a view of the original list on which the transformations are lazily performed. From the documentation:
The function is applied lazily, invoked when needed. This is necessary for the returned list to be a view, but it means that the function will be applied many times for bulk operations like `List.contains(java.lang.Object)` and `List.hashCode()`. For this to perform well, function should be fast. To avoid lazy evaluation when the returned list doesn't need to be a view, copy the returned list into a new list of your choosing.
Obviously the syntax for implementing the `Function` is rather verbose - that's Java for you until lambdas. I typically keep commonly used functions as constants to avoid clutter and re-instantiation at the call site:
public class Baby {
...
public static class Functions {
private static final Function<Baby, String> GET_NAME =
new Function<Baby, String>() {
@Override
public String apply(Baby baby) {
return baby.getName();
}
};
private Functions() { }
public static Function<Baby, String> getName() {
return GET_NAME;
}
}
}
Yes, it's even more code but it's hidden away and more maintainable. Then at the call site:
List<String> babyNames = Lists.transform(babies, Baby.Functions.getName());
Problem
Okay so let's say I have a really simple class, e.g. ``` public class Baby { private String Name = "alf"; public String getName() { return Name; } } ``` Now what I'd like to know. Given a list of Baby's, is there any niftier/cooler/shorter way in Java to create an array/arraylist of the Baby's names' rather than simple looping through all the babies and adding their names to the new list? The equivalent of this: ``` ArrayList<Baby> babies = new ArrayList<Baby>(); /* some code adding a bunch of babies to the arraylist */ ArrayList<String> names = new ArrayList<String>(); for (Baby b : babies) { names.add(b.getName()); } ``` ...but cooler. Know what I mean?