Recibo una lista de matrices de objetos,
List<Object[]> rawRows = service.getRows();
Cualquier valor particular se puede obtener como por ejemplo,
(Date)((Object[])rawRows.get(i))[3] // In each item, Array Element #3 is a certain Date
Necesito a un mapa List<Report>
para un POJO que tiene campos específicos definidos para cada valor:
public class Report {
private String abbreviation;
private String username;
private Integer recallid;
private Date recalldate;
// ... + getters/setters
// Constructor
public Report (String abbreviation, String username, Integer recallid, Date recalldate, ...)
{
}
}
Estoy confundido sobre lo siguiente: ¿Cómo puedo especificar el índice en esta expresión Lamba para mapear a mi nuevo List<Report>
?
List<Report> detailReports = rawRows.stream().map(obj -> new Report(
(String)((Object[])rawRows.get(0))[0], // I'm hard-coding (0) but need "i"
(String)((Object[])rawRows.get(0))[1], // I'm hard-coding (0) but need "i"
(Integer)((Object[])rawRows.get(0))[2],// I'm hard-coding (0) but need "i"
(Date)((Object[])rawRows.get(0))[3], // I'm hard-coding (0) but need "i"
//...
)).collect(Collectors.toList());
Mi objetivo es tener un List<Report>
con todos los elementos de la matriz asignadas a la POJO por objeto precisamente por la secuencia especificada. Pero no hay i
índice para mí para hacer un seguimiento. En este ejemplo estoy codificación dura 0
como rawRow
para llegar desde la lista original.
En primer lugar, cambiar su lambda de
obj -> new Report((String)((Object[])rawRows.get(0))[0] ...
a
obj -> new Report((String) obj[0] ...
obj
es el parámetro lambda, y en la map()
función tendrá sobre el valor de cada elemento rawRows
.
A continuación, me gustaría realmente recomiendo la conversión de la lambda en una función separada, llamada. Esto tendría la firma public Report rawRowToReport(Object[] rawRow)
y celebrará toda su lógica de indexación, en lugar de escribirlo en el cuerpo lambda.
La razón de esto es, como se ha notado, "no hay ningún i
índice para mí pista" : esto se debe a que la indexación se realiza i
es en la propia fila prima. Es sólo la lógica de deserialización de lo que está en el Object[]
. Este tipo de lógica debe ser encapsulado en su propio método (o, idealmente, de clase), que sólo se ocupa de la serialización y / o deserializar. Los usuarios externos (como tu Stream
) delegan el quid de la cuestión a esa clase o método. En última instancia, la Stream
única maneja el proceso de iteración sobre los datos y la aplicación de filtros y transformaciones. No sabe lo que esos filtros y transformaciones requieren.
rawRows.stream().map(this::rawRowToReport).collect(Collectors.toList());