Imagina que tengo una lista de ciertos objetos:
List<Student>
Y necesito generar otra lista que incluya la ids
de Students
en la lista anterior:
List<Integer>
Evitando usar un bucle, ¿es posible lograr esto usando colecciones de apache o guayaba ?
¿Qué métodos deberían ser útiles para mi caso?
java
list
collections
java-stream
guava
Javatar
fuente
fuente
Respuestas:
Java 8 forma de hacerlo: -
fuente
Con Guava puedes usar funciones como -
private enum StudentToId implements Function<Student, Integer> { INSTANCE; @Override public Integer apply(Student input) { return input.getId(); } }
y puede usar esta función para convertir la Lista de estudiantes a identificadores como -
Seguramente se repetirá para extraer todos los identificadores, pero recuerde que los métodos de guayaba devuelven la vista y la función solo se aplicará cuando intente iterar sobre el
List<Integer>
Si no itera, nunca aplicará el ciclo.
Nota: Recuerde que esta es la vista y si desea iterar varias veces, será mejor copiar el contenido en alguna otra
List<Integer>
comofuente
Gracias a Premraj por la opción genial alternativa, upvoted.
He utilizado apache CollectionUtils y BeanUtils. En consecuencia, estoy satisfecho con el rendimiento del siguiente código:
List<Long> idList = (List<Long>) CollectionUtils.collect(objectList, new BeanToPropertyValueTransformer("id"));
Vale la pena mencionar que compararé el rendimiento de la guayaba ( proporcionada por Premraj ) y collectionUtils que usé anteriormente, y decidiré cuál es la más rápida.
fuente
Identifiable
quégetId()
método define y luego puede usar este patrón singleton de enumeración única para extraer Id comúnmente.Solución de expresión lambda de Java 8:
fuente
Si alguien llega después de unos años:
List<String> stringProperty = (List<String>) CollectionUtils.collect(listOfBeans, TransformerUtils.invokerTransformer("getProperty"));
fuente
Es matemáticamente imposible hacer esto sin un bucle. Para crear un mapeo, F, de un conjunto discreto de valores a otro conjunto discreto de valores, F debe operar en cada elemento del conjunto de origen. (Se requiere un bucle para hacer esto, básicamente).
Habiendo dicho eso:
¿Por qué necesita una nueva lista? Podría estar abordando cualquier problema que esté resolviendo de manera incorrecta.
Si tiene una lista de
Student
, entonces está a solo uno o dos pasos de distancia, cuando recorra esta lista, de iterar sobre los números de identificación de los estudiantes.for(Student s : list) { int current_id = s.getID(); // Do something with current_id }
Si tiene otro tipo de problema, entonces comente / actualice la pregunta e intentaremos ayudarlo.
fuente