2016-03-24 5 views
5

Ich fand den folgenden Code, der ein Element unter bestimmten Umständen (wenn es nicht OLD ist) zu einer Liste hinzugefügt. Diese Liste wird danach in eine gemeinsame Kontrollliste gepackt.Refactor Erstellung einer Liste mit Java 8 Streams

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

habe ich versucht, die folgende Refactoring java8 Streams mit:

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

Das Problem ist die Karte Methode ...

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

Was kann ich in den weiterhin Fällen tun? null zurückgeben? Ich könnte dann null Werte aus dem Stream über

filtern Ist die Verwendung von Optionals eine Option hier?

Antwort

2

Es ist nicht so schön, aber Sie können die folgende

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

haben Dies schafft eine Stream<KonditionValue> und hält nur diejenigen, in denen der Status nicht StatusKz.OLD ist. Dann ordnet es jede von ihnen in ihre TermKondTilgValue s, wo nur die TermKondTilgValue mit einem Status nicht StatusKz.OLD gehalten werden.

Beachten Sie, dass wir einen Verweis auf sowohl die TermKondTilgValue und KonditionValue halten, weil wir später brauchen, also verwenden wir eine AbstractMap.SimpleEntry als Halter für zwei Werte.

Schließlich wird dieser Stream der entsprechenden TerminKondTilgListContent zugeordnet und in einer Liste gesammelt.

+1

Dies sollte funktionieren. Denkst du nicht, dass es schwer zu lesen ist? Meine Lösung sieht ein wenig lesbarer aus. Ich bin mir immer noch nicht sicher, was ich in diesem Fall mit dem "Return-Null" tun soll. – Chris311

+2

@ Chris311 Ihre Lösung ist wirklich eine Mischung aus Ihrem alten Code. Ich denke, es ist etwas schwer zu lesen, daher wäre es keine schlechte Idee, Ihre For-Schleife zu behalten. – Tunaki

+0

Ok, ich werde hier kein java8 stream-refactoring verwenden :-) – Chris311