2016-03-24 37 views
5

Znalazłem następujący kod, który dodaje element w pewnych okolicznościach (jeśli nie jest OLD) do listy. Ta lista zostanie później spakowana na wspólną listę kontrolną.Utworzenie refaktora listy ze strumieniami java 8

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)); 

Próbowałem następujące refaktoryzacji korzystając java8 strumienie:

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)); 

problemu jest metoda mapy ...

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; 
} 

Co mogę zrobić w przypadkach kontynuować? return null? Mogłabym następnie filtrować wartości zerowe wartości ze strumienia poprzez: Czy korzystanie z opcji jest tutaj opcjonalne?

Odpowiedz

2

To nie jest tak ładna, ale można mieć następującą

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

Stwarza to Stream<KonditionValue> i tylko utrzymuje te, których status nie jest StatusKz.OLD. Następnie płaska mapuje każdą z nich na swoje TermKondTilgValue s, gdzie przechowywane są również tylko TermKondTilgValue o statusie nie będącym .

Należy pamiętać, że zachowujemy odniesienie do TermKondTilgValue i KonditionValue, ponieważ będziemy potrzebować później, więc używamy AbstractMap.SimpleEntry jako właściciela dla dwóch wartości.

Wreszcie ten strumień jest mapowany na odpowiadający TerminKondTilgListContent i gromadzony na liście.

+1

To powinno zadziałać. Nie sądzisz, że trudno to odczytać? Moje rozwiązanie wygląda na bardziej czytelne. Chociaż nadal nie jestem pewien, co zrobić z "return null" w tym przypadku. – Chris311

+2

@ Chris311 Twoje rozwiązanie jest mieszanką starego kodu. Myślę, że to trochę trudne do odczytania, dlatego utrzymanie pętli for nie byłoby złym pomysłem. – Tunaki

+0

OK, nie będę używać tutaj stream-refactoring java8 :-) – Chris311

Powiązane problemy