2016-11-25 1 views
-1

나는이리스트 목록을 가지고있다. (끔찍한 코드에 사과한다.) 어떻게 이것을 람다로 변환 할 수 있는가?이것을 람다로 변환하는 방법

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) 'peek'을 사용하여 값을 가져 오지 말고 터미널 연산자를 사용하십시오. 'findFirst(). orElse (...)'2) 범위를 작아지면서 정보를 잃어 버리는 동안 모든 것을 flatMap하지 말고 대신 원래의 사용 목록을 스트리밍하십시오. 당신이 필터를 필요로한다면 내부 루프가 필요하고 자체 스트림을 설정하고 특정 검사를 수행하는 다른 메소드에 위임하십시오. –

+0

팁 주셔서 감사합니다. 그러나 이것을 어떻게 할 수 있는지 보여 줄 수 있습니까? – user293655

답변

1

요약 가지의

커플 :

  • 대신 터미널 연산자를 사용

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

    나는 이메일을 여전히 수없는 다음을 시도했지만 한 peek의 이메일 주소를 찾으려면을 사용하십시오.

  • 는 발견
  • 대리인이 사용자가 적절한 캡슐화 및 청소기 코드를 얻기 위해 적절한 클래스에 직장 주소가 있는지 확인하는 검사가 존재하는 경우에서 전자 메일 요지를 얻을 수 EmailAddressInformationDataType 수준에서 스트림을 유지

귀하의 getEmail() 방법 상단에

시작, 우리는 업무용 전자 메일 주소가 발견되면 없습니다 우리는 그냥 빈 문자열을 반환하는 경우, 이메일 주소를 반환하는 방법을 원하는 :

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

비고 findAnyOptional을 반환합니다. 그것을 사용하는 방법을 모른다면 몇 가지 조사를 해보십시오. 발견 된 주소에서 이메일 주소를 얻는 깨끗한 해결책으로 여기에 사용됩니다. 찾지 못하면 빈 문자열이 반환됩니다.

여전히을 할 :

  • 어쩌면 클래스와의 hasWorkEmailgetEmailAddress를 넣어이 클래스 또는 WorkerType 클래스 중 하나 방법으로 추출하여 긴 게터 체인을 청소 static 메소드는 EmailAddressInformationDataType을 수신합니다. EmailAddress 클래스의 이름을 지정하면 EmailAddress:hasWorkMail을 쓸 수 있습니다.이 값은 더 짧고 읽기 쉽습니다.

EmailAddressInformationDataType

EmailAddressInformationDataTypehasWorkEmail() 방법이 새로운 방법은 hasWorkEmail()라고했습니다

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

들이 생성되기 때문에 당신이보고는 -DataType 클래스를 조정할 수없는 경우 이전주의 사항 : EmailAddressInformationDataType을 허용하는 메서드로 정적 클래스 EmailAddress으로 이동하십시오. 여기에 사용 된 isPublic 메서드는 기존의 메서드입니다. isPublichasWorkEmailCommunicationMethodUsage과 같이 더 짧은 이름의 정적 방법으로 다시 이동시켜야합니다. 모든 상용구 접미사는 그대로 둡니다.

여기 CommunicationMethodUsageInformationDataType

같은 이야기, 매핑 및 필터와 간단한 스트림에 hasWorkEmail() 방법. 우리는 모든 이메일 주소는 업무용 전자 메일 주소가 있는지 확인하기 위해 anyMatch를 사용 :이 코드는 컴파일 및 작동

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

} 

; 코드를 다시 작성하고 나머지 코드베이스를 동일한 방식으로 다루는 방법에 대한 명확한 시작을 제공해야합니다.