2017-04-13 2 views
0

Hallo Ich habe zwei Schleifen durch Listen iteriert und der Name-Eigenschaft Schalter verwenden, aber ich möchte, Refactoring und Verwendung Ströme statt, aber nicht sicher, wie es geht:JAVA8 zwei für jeden Schleifen zu streamen

hier ist der Code-Schnipsel

for (ClaimDTO claimDTO: claimDTOs) { 
    for (CategoryDTO categoryDTO : claimDTO.getCategories()) { 
     switch (categoryDTO.getCategoryType()) { 
      case "ALLOWANCE": { 
       categoryDTO.setName("Flight"); 
       break; 
      } 
      case "MILEAGE": { 
       categoryDTO.setyName("Car"); 
       break; 
      } 
      default: 
       categoryDTO.setName("Expenses"); 

     } 
    } 
} 

Soll ich Funktion für die Namensauflösung und es nur in Strom verwenden oder es ist nicht einmal wert und nicht LOC speichern.

+0

Haben Sie schon selbst etwas ausprobiert? Das sieht nicht nach etwas aus, das ich in Streams umschreiben möchte. –

+0

Sie können die ganzen verschachtelten Loops oder sogar Streams vermeiden, indem Sie die Eigenschaft 'name' von' CategoryDTO' zu einer berechneten Eigenschaft machen. Oder indem Sie 'CategoryDTO' zu einer Aufzählung machen. – andih

Antwort

1

können Sie flatMap verwenden, um alle Kategorie dtos in einem einzigen Strom zu erhalten:

claimDTOs.stream() 
    .flatMap(claim -> claim.getCategories().stream()) 
    .forEachOrdered(this::setName); 

forEachOrdered nehmen dann einen Verbraucher, die für jedes Element ausgeführt und kann als eine Methode Referenz (zwei Doppelpunkte) verwiesen werden.

private void setName(CategoryDTO categoryDTO) { 
    switch (categoryDTO.getCategoryType()) { 
     case "ALLOWANCE": { 
      categoryDTO.setName("Flight"); 
      break; 
     } 
     case "MILEAGE": { 
      categoryDTO.setName("Car"); 
      break; 
     } 
     default: 
      categoryDTO.setName("Expenses"); 

    } 
} 
+0

Ist 'forEach' nicht gut genug hier? Und ja, du hast seine Schleifen in einen Stream umgeschrieben, aber hast du dadurch etwas gewonnen, z. Leistung, Lesbarkeit? –

+1

@RobinTopper: Wenn Sie sich nicht um die Reihenfolge kümmern (was wahrscheinlich hier der Fall ist), wird ja 'forEach' genügen. Wahrscheinlich hängt es davon ab, wer mit Streams, Flatmap, Methodenreferenz usw. vertraut ist, wenn dies besser lesbar ist. Persönlich finde ich, dass der Code bei Streams oft prägnanter und eleganter ist. – eee

+0

Warum haben Sie Stream in FlatMap aufgerufen? Ist es nicht schon wieder zurück? – sunofkyuss

Verwandte Themen