2016-11-25 3 views
-1

Ich habe diese Liste Liste (Entschuldigung für die abscheuliche Code) Wie kann ich dies in Lambda umwandeln?Wie konvertiere ich dies in Lambda

List<EmailAddressInformationDataType> emailInfoDataList = workerType.getWorkerData().getPersonalData().getContactData().getEmailAddressDatas(); 

for(EmailAddressInformationDataType infoData : emailInfoDataList) 
{ 
    List<CommunicationMethodUsageInformationDataType> usageInfoList = infoData.getUsageDatas(); 
    for(CommunicationMethodUsageInformationDataType methodUsage : usageInfoList) 
    { 
     if(methodUsage.isPublic()) 
     { 
      List<CommunicationUsageTypeDataType> usageTypes = methodUsage.getTypeDatas(); 

      for(CommunicationUsageTypeDataType usageType : usageTypes) 
      { 
       if(usageType.isPrimary()) 
       { 
        CommunicationUsageTypeObjectType typeRefs = usageType.getTypeReference(); 
        typeRefs.getIDS().stream() 
              .filter(id -> id.getType().equals(WorkdayDataType.Communication_Usage_Type_ID) 
                  && id.getValue().equalsIgnoreCase("WORK")); 
          email = infoData.getEmailAddress(); 
          break; 
         } 
        } 
       } 

      } 
     } 

Ich habe folgendes versucht, aber immer noch nicht die E-Mail zu erhalten:

emailInfoDataList.stream() 
         .peek(s -> s.getEmailAddress()) 
         .flatMap(s -> s.getUsageDatas().stream()) 
         .filter(s -> s.isPublic()) 
         .flatMap(s -> s.getTypeDatas().stream()) 
         .filter(s -> s.isPrimary()) 
         .map(s -> s.getTypeReference()) 
         .flatMap(s -> s.getIDS().stream()) 
         .filter(s-> s.getType().equals(WorkdayDataType.Communication_Usage_Type_ID) 
            && s.getValue().equalsIgnoreCase("WORK")) 
         ; 
+0

1) Verwenden Sie 'peek' nicht, um einen Wert zu erhalten, aber verwenden Sie einen Terminaloperator, z. 'findFirst() .oderElse (...)' 2) FlatMap nicht alles, da Sie Informationen verlieren, während Ihr Bereich kleiner und kleiner wird, streamen Sie stattdessen die ursprüngliche Liste von usageDatas und wenn Sie einen Filter benötigen das benötigt eine innere Schleife, delegiere zu einer anderen Methode, die seinen eigenen Strom aufbaut und die spezifische Prüfung tut –

+0

Dank für den Tipp. Aber könntest du mir ein Beispiel zeigen, wie das geht? – user293655

Antwort

1

Zusammenfassung

Paar Dinge:

  • einen Terminalbetreiber anstelle von peek, um eine E-Mail-Adresse zu finden, die wir verwenden findAny
  • halten den Strom auf EmailAddressInformationDataType Ebene, um die E-Mail-Adresse von ihm zu bekommen, wenn es ein gefunden ist
  • Delegat der Inspektion zu sehen, ob der Benutzer eine Anschrift in den entsprechenden Klassen hat, um die richtige Verkapselung und sauberen Code zu erhalten

Ihre getEmail() Methode

Anfang an der Spitze, wollen wir eine Methode, die die E-Mail-Adresse zurückgibt, wenn eine Adresse-E-Mail gefunden wird, wenn nicht nur wir wieder einen leeren String:

private String getEmail() { 
     return workerType.getWorkerData().getPersonalData().getContactData().getEmailAddressDatas().stream() 
         .filter(EmailAddressInformationDataType::hasWorkEmail) 
         .findAny() 
         .map(EmailAddressInformationDataType::getEmailAddress) 
         .orElse(""); 
    } 

Hinweis, dass findAny eine Optional zurückgibt. Wenn Sie nicht wissen, wie man es benutzt, machen Sie etwas Recherche, es wird hier als saubere Lösung verwendet, um entweder die E-Mail-Adresse aus dem gefundenen EmailAddressInformationDataType zu erhalten, oder, falls keine gefunden wurde, wird der leere String zurückgegeben.

Noch zu tun:

  • reinigen Sie die lange Getter Kette, indem sie ein Verfahren entweder auf dieser Klasse oder in der WorkerType Klasse Extrahieren
  • vielleicht die hasWorkEmail und getEmailAddress in einer Klasse setzen, wie eine statische Methode, die eine EmailAddressInformationDataType empfängt. Wenn Sie die Klasse EmailAddress benennen, können Sie EmailAddress:hasWorkMail schreiben, was kürzer und einfacher zu lesen ist.

    public boolean hasWorkEmail() { 
        return getUsageDatas().stream() 
              .filter(CommunicationMethodUsageInformationDataType::isPublic) 
              .anyMatch(CommunicationMethodUsageInformationDataType::hasWorkEmail); 
    } 
    

    Wenn Sie nicht anpassen können die -DataType Klassen, weil sie erzeugt werden, schauen Sie sich das:

Die hasWorkEmail() Methode auf EmailAddressInformationDataType

die EmailAddressInformationDataType eine neue Methode hasWorkEmail() genannt vorherige Bemerkungen: verschiebe sie in eine statische Klasse EmailAddress mit einer Methode, die die EmailAddressInformationDataType akzeptiert. Beachten Sie, dass die hier verwendete Methode isPublic nur die vorhandene Methode ist. Fühlen Sie sich frei, die isPublic und hasWorkEmail wieder auf eine statische Methode mit einem kürzeren Namen wie CommunicationMethodUsage zu verschieben, wobei alle Boilerplatten-Suffixe entfernt bleiben.

Die hasWorkEmail() Methode auf CommunicationMethodUsageInformationDataType

Die gleiche Geschichte hier, einfach Strom mit Zuordnungen und Filtern. Wir verwenden anyMatch zu sehen, ob eine E-Mail-Adresse ein geschäftliches E-Mail-Adresse lautet:

public boolean hasWorkEmail() { 

    return getTypeDatas().stream() 
        .filter(CommunicationUsageTypeDataType::isPrimary) 
        .map(CommunicationUsageTypeDataType::getTypeReference) 
        .map(CommunicationUsageTypeObjectType::getIDS) 
        .flatMap(List::stream) 
        .filter(id -> id.getType().equals(WorkdayDataType.Communication_Usage_Type_ID)) 
        .anyMatch(id -> "WORK".equalsIgnoreCase(id.getValue())); 

} 

Dieser Code kompiliert und arbeitet; Es sollte Ihnen einen definitiven Start geben, wie Sie Ihren Code umschreiben und den Rest der Codebasis auf die gleiche Weise angehen können.

Verwandte Themen