2015-01-27 11 views
7

Uso del pacchetto Java 8 Stream Voglio trasformare un elenco di matrici di tipo oggetto in un elenco di un oggetto di classe specifico. Gli array sul primo elenco contengono il campo della classe caricato dal database.Java 8 - Come trasformare un elenco di matrici in un elenco di un oggetto di classe specifico

Questa è la lista di array di tipo oggetto caricato dal DB:

List<Object[]> results = loadFromDB(); 

Ogni elemento Object[] presente nella lista contiene i campi che voglio mappare la seguente classe:

class DeviationRisk { 
    Timestamp plannedStart; 
    Timestamp plannedEnd; 
    String rcsName; 
    BigDecimal riskValue; 
    BigDecimal mediumThreshold; 
    BigDecimal highThreshold; 
    Interval interval; 

    String getRcsName() { 
     return rcsName; 
    } 

    DeviationRisk(Object[] res) { 
     this((Timestamp) res[0], (Timestamp) res[1], (String) res[2], (BigDecimal) res[3], (BigDecimal) res[4], (BigDecimal) res[5]); 

    } 

    DeviationRisk(Timestamp start, Timestamp end, String rcs, BigDecimal risk, BigDecimal medium, BigDecimal high) { 
     plannedStart = start; 
     plannedEnd = end; 
     rcsName = rcs; 
     riskValue = risk; 
     mediumThreshold = medium; 
     highThreshold = high; 
     interval = new Interval(plannedStart.getTime(), plannedEnd.getTime()); 
    } 

    DeviationRisk create(Object[] res) { 
       return new DeviationRisk(res); 
      } 

    List<DateTime> getRange() { 
     return DateUtil.datesBetween(new DateTime(plannedStart), new DateTime(plannedEnd)); 
    } 
} 

Come si può vedere ogni elemento Object[] presente nell'elenco originale results è solo la rappresentazione dell'array dell'oggetto DeviationRisk

.210

Ora, so come farlo utilizzando i cicli E 'solo 3 righe di codice come potete vedere qui sotto:

List<DeviationRisk> deviations = new ArrayList<>(); 
     for (Object[] res : results) { 
      deviations.add(new DeviationRisk(res)); 
     } 

Come ottenere lo stesso risultato utilizzando Java 8 Streams?

risposta

18

Si può provare con:

List<DeviationRisk> result = results.stream() 
            .map(DeviationRisk::new) 
            .collect(Collectors.toList()) 
+0

risposta breve e intelligente +1. –

+0

Cheers :) Mi mancava la chiamata al nuovo. – Alboz

+0

@kocko puoi spiegare la parte della mappa di esso. Cosa succede quando dici DeviationRisk :: new. So che questo è un riferimento costruttore, ma non riesco a capire cosa succede nel metodo della mappa quando viene passato un riferimento costruttore. – CKing

6

Questo lo farà:

final List<DeviationRisk> l = results.stream() 
    .map(DeviationRisk::new).collect(Collectors.toList()); 

questo lavoro perché DeviationRisk::new è visto come un Function<Object[], DeviationRisk> dal compilatore.

+0

stessa risposta come sopra, quindi ti meriti anche un +1 :) – Alboz

+0

@ fge puoi spiegarci la parte della mappa. Cosa succede quando dici DeviationRisk :: new. So che questo è un riferimento costruttore, ma non riesco a capire cosa succede nel metodo della mappa quando viene passato il riferimento del costruttore. – CKing

+0

@bot come ho spiegato, questo è dovuto al fatto che 'DeviationRisk :: new' è visualizzato, _at il livello del compilatore_, come' Funzione '. Ciò che conta è il tipo di argomento ('Object []') e il tipo restituito 'DeviationRisk'. Dimentica che questo è un costruttore in questo caso; il compilatore è in grado di dedurre il fatto che alla fine, se si passa qualcosa che è un 'oggetto [] 'alla lambda, il risultato sarà un' DeviationRisk'. Che questo particolare lambda sia in effetti un riferimento al metodo di un costruttore non ha alcuna importanza - potrebbe essere qualsiasi altra cosa – fge

Problemi correlati