2016-03-24 42 views
5

Ho trovato il seguente codice, che aggiunge un elemento in determinate circostanze (se non è VECCHIO) a un elenco. Questo elenco viene inserito in una lista di controlli comuni in seguito.Creazione del refactoring di un elenco con java 8 stream

List<ListDataContent> list = new ArrayList<>(); 

    for (KonditionValue kondition : konditions) { 
     if (kondition.getStatusKz().equals(StatusKz.OLD)) 
      continue; 
     for (TermKondValue tilg : kondition.getTermimKonditions()) { 
      if (tilg.getStatusKz().equals(StatusKz.OLD)) 
       continue; 

      TerminKondListContent listContent = new TerminKondListContent(tilg, kondition.getChangeDatum(), funds); 
      list.add(listContent); 
     } 
    } 

    SimpleListControl listCtrl = new SimpleListControl(); 
    listCtrl.setDataModel(new ListDataModel(list)); 

ho provato la seguente refactoring utilizzando flussi java8:

List<ListDataContent> list = konditionen.stream().map(kondition -> map(tilg, kondition.getChangeDate(), funds)).sorted().collect(Collectors.toList()); 
SimpleListControl listCtrl = new SimpleListControl(); 
listCtrl.setDataModel(new ListDataModel(list)); 

Il problema è il metodo map ...

private TerminKondListContent map(TermKondValue tilg, Date changeDate, BigDecimal funds) { 
    if (kondition.getStatusKz().equals(StatusKz.OLD)) 
     return null; 
    for (TermKondValue zins : kondition.getTerminkonditions()) { 
     if (zins.getStatusKz().equals(StatusKz.OLD)) 
      return null; 

     return new TerminKondListContent(tilg, changeDate, funds); 
    } 
    return null; 
} 

Cosa posso fare nei casi di continuare? restituire null? Potrei quindi filtrare Valori nulli dallo stream tramite

list.stream().filter(Objects::nonNull) 

L'opzione Optional è un'opzione qui?

risposta

2

Non è che abbastanza, ma si può avere il seguente

List<ListDataContent> list = 
    konditions.stream() 
       .filter(kondition -> !kondition.getStatusKz().equals(StatusKz.OLD)) 
       .flatMap(kondition -> 
       kondition.getTerminTilgkonditions() 
          .stream() 
          .filter(tilg -> !tilg.getStatusKz().equals(StatusKz.OLD)) 
          .map(tilg -> new AbstractMap.SimpleEntry<>(kondition, tilg)) 
      ) 
       .map(e -> new TerminKondTilgListContent(e.getValue(), e.getKey().getChangeDatum(), funds)) 
       .collect(Collectors.toList()); 

Questo crea un Stream<KonditionValue> e mantiene solo quelli in cui lo stato non è StatusKz.OLD. Quindi, esegue la mappatura di ciascuno di essi nei rispettivi TermKondTilgValue s, dove viene mantenuto solo lo TermKondTilgValue con stato StatusKz.OLD.

Si noti che manterremo un riferimento sia a TermKondTilgValue sia a KonditionValue perché avremo bisogno in seguito, quindi usiamo un AbstractMap.SimpleEntry come supporto per due valori.

Infine, questo Stream è mappato allo TerminKondTilgListContent corrispondente e raccolto in un elenco.

+1

Questo dovrebbe funzionare. Non pensi che sia un po 'difficile da leggere? La mia soluzione sembra un po 'più leggibile. Anche se non sono ancora sicuro di cosa fare con il "ritorno null" in questo caso. – Chris311

+2

@ Chris311 La tua soluzione è davvero un mix del tuo vecchio codice. Penso che sia un po 'difficile da leggere, quindi tenere il tuo ciclo non sarebbe una cattiva idea. – Tunaki

+0

Ok, non userò java8 stream-refactoring qui :-) – Chris311