2011-11-21 22 views
7

En C# Puedo hacer esto:propiedad colecta de objetos de colección

IEnumerable<long> ids = things.select(x => x.Id); 

En Java que tengo que hacer esto:

Collection<Long> ids = new ArrayList<Long>(things.size()); 
for(Thing x : things) 
    ids.add(x.getId()); 

tiene que hacer este tipo de cosas mucho ahora y Me pregunto si hay una forma más genérica de hacer esto en Java. Podría crear un método para hacerlo, pero luego tendría que agregar una interfaz con el método getId o algo así ... que no puedo ...

+0

Supongo que 'things' no hereda de Collection o de una matriz. –

+1

¿Por qué asumes eso? Bucle sobre 'cosas' usando' for', así que tiene que ser array o iterable al menos. – Svish

+0

@Brett Walker se requiere una colección de identificadores, no otra colección de cosas – NimChimpsky

Respuesta

2

usando Guava, en concreto el function interface:

public class ThingFunction implements Function<Thing, Long> { 
    @Override 
    public Long apply(Thing thing) { 
     return user.getId(); 
    } 
} 

e invocado como este (donde la transformada es una importación estática de Collections2 de la guayaba:

Collection<Long> ids = transform(things, new ThingFunction()); 

guayaba tiene un buen número other benefits demasiado

.
0

Usted puede probar este método. Se necesita una colección, un método (desde la API de reflexión) y una clase objetivo. Invoca el método en todos los miembros de la colección y devuelve una lista de resultados.

public <T> Collection<T> select(Collection<? extends Object> input, Method getter, Class<T> targetClazz) { 
    ArrayList<T> result = new ArrayList<T>(); 
    for (Object object : input) { 
     try { 
      Object resultObject = getter.invoke(object, (Object[]) null); 
      if (targetClazz.isAssignableFrom(resultObject.getClass())) { 
       result.add(targetClazz.cast(resultObject)); 
      } 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } catch (InvocationTargetException e) { 
      e.printStackTrace(); 
     } 
    } 
    return result; 
} 

Ignore el manejo correcto de errores por el momento. Uso:

try { 

    Method getId = Thing.class.getMethod("getId", null); 
    Collection<Long> result = select(things, getId, Long.class); 

} catch (SecurityException e) { 
    e.printStackTrace(); 
} catch (NoSuchMethodException e) { 
    e.printStackTrace(); 
} 
0

No es realmente una respuesta, pero puede esperar java 8, que tendrá soporte de expresión lambda. Aparte de eso, creo que la guayaba es tu mejor opción.

+0

Con la velocidad de Java, eso podría tomar algunas décadas sin embargo? : p – Svish

+0

está en el calendario de octubre de 2012, por lo que está justo detrás de la esquina;) – soulcheck

+0

Pero eso no significa que pueda usarlo entonces, jeje. Todavía en 1.6 en la organización en la que trabajo actualmente ... – Svish

1

Usando Apache Commons 'BeanUtils y Colecciones:

Collection<Long> ids = CollectionUtils.collect(things, 
     new BeanToPropertyValueTransformer("id")); 
Cuestiones relacionadas