Usa google collections. Ejemplo:
Function<ViewValue, Long> transform = new Function<ViewValue, Long>() {
@Override
public Long apply(ViewValue from) {
return from.getId();
}
};
List<ViewValue> list = Lists.newArrayList();
List<Long> idsList = Lists.transform(list, transform);
ACTUALIZACIÓN:
En Java 8 que no necesitan de guayaba. Puede:
import com.example.ViewValue;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
Function<ViewValue, Long> transform = ViewValue::getId;
List<ViewValue> source = new ArrayList<>();
List<Long> result = source.stream().map(transform).collect(Collectors.toList());
O simplemente:
List<ViewValue> source= new ArrayList<>();
List<Long> result = source.stream().map(ViewValue::getId).collect(Collectors.toList());
próxima actualización (la última después de Javaslang a Vavr cambio de nombre):
Actualmente vale la pena mencionar sobre la solución con
Biblioteca de Javaslang (
http://www.javaslang.io/)
Biblioteca Vavr (http://www.vavr.io/). Asumamos que tenemos nuestra lista con los objetos genuinos:
List<ViewValue> source = newArrayList(new ViewValue(1), new ViewValue(2), new ViewValue(2));
podríamos hacer la transformación con la clase de lista de la biblioteca Javaslang (en el largo plazo la recoge no es conveniente):
List<Long> result = io.vavr.collection.List.ofAll(source).map(ViewValue::getId).toJavaList();
Pero se quiere ver el poder con sólo las listas Javaslang:
io.vavr.collection.List<ViewValue> source = javaslang.collection.List.of(new ViewValue(1), new ViewValue(2), new ViewValue(3));
io.vavr.collection.List<Long> res = source.map(ViewValue::getId);
animo a echar un vistazo colecciones disponibles y nuevos tipos de esa biblioteca (me gusta especialmente el tipo TRY). Encontrará la documentación en la siguiente dirección:
http://www.javaslang.io/javaslang-docs/
http://www.vavr.io/vavr-docs/.
PS. Debido a que Oracle y la palabra "Java" dentro del nombre tenían que cambiar el nombre de la biblioteca de javaslang a otra cosa. Habían decidido a Vavr.
Solución muy Javaesque - pero no en el buen sentido. No reduce exactamente la cantidad o complejidad del código, ¿verdad? –
Diría que es más LINQ-esque que Java-esque personalmente. Prefiero crear el código de conversión y luego aislar el aspecto de proyección, pero si prefieres duplicar la lógica de conversión un montón de veces, está bien. Sería mucho mejor con expresiones lambda, por supuesto. –
¿No es algo como lo que hacemos con Comparator en Java? –