Java 8 Lambda: Mapa List <Object []> (Lista de matrices de objetos) a la lista <bean>

gen b. :

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 0como rawRowpara llegar desde la lista original.

MyStackRunnethOver:

En primer lugar, cambiar su lambda de

obj -> new Report((String)((Object[])rawRows.get(0))[0] ...

a

obj -> new Report((String) obj[0] ...

objes 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 ies 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());

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=478323&siteId=1
Recomendado
Clasificación