Java 8 Lambda: Liste Carte <Object []> (Liste des tableaux d'objets) à la liste <Bean>

gène b. :

Je reçois une liste de tableaux d'objets,

List<Object[]> rawRows = service.getRows();

Toute valeur particulière peut être obtenue que par exemple

(Date)((Object[])rawRows.get(i))[3]  // In each item, Array Element #3 is a certain Date

Je dois carte à un List<Report>pour un POJO qui a des champs spécifiques définis pour chaque valeur:

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, ...)
    {
    }
}

Je suis perplexe sur ce qui suit: Comment puis-je préciser l' index dans cette expression Lamba à la carte à mon nouveau 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());             

Mon objectif est d'avoir un List<Report>avec tous les éléments du tableau mis en correspondance avec l'objet POJO par exactement par la séquence spécifiée. Mais il n'y a pas iindex pour moi à suivre. Dans cet exemple , je suis coder en dur 0comme rawRowpour obtenir de la liste initiale.

MyStackRunnethOver:

Tout d'abord, changer votre lambda de

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

à

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

objest le paramètre lambda, et dans la map()fonction va prendre la valeur de chaque élément rawRows.

Ensuite, je recommande vraiment convertir le lambda dans une procédure distincte, fonction nommée. Cela aurait signature public Report rawRowToReport(Object[] rawRow)et détiendrait toute votre logique d'indexation, au lieu de l'écrire dans le corps lambda.

La raison en est, comme vous l' avez remarqué, « il n'y a pas l' iindex pour moi sur la piste » : c'est parce que l'indexation se fait par iest dans la ligne brute elle - même. Il est vraiment juste la logique de désérialisation pour tout ce qui est dans le Object[]. Ce genre de logique doit être encapsulé dans sa propre méthode (ou idéalement classe) qui ne traite que de sérialisation et / ou désérialisation. Utilisateurs extérieurs (comme votre Stream) délèguent le Nitty Gritty à cette classe ou méthode. En fin de compte, la Streamseule gère le processus de itérer sur les données et l' application des filtres et des transformations. Il ne sait pas ce que ces filtres et les transformations ont besoin.

rawRows.stream().map(this::rawRowToReport).collect(Collectors.toList());

Je suppose que tu aimes

Origine http://10.200.1.11:23101/article/api/json?id=478321&siteId=1
conseillé
Classement