요약 가지의
커플 :
- 대신 터미널 연산자를 사용
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("");
}
비고 findAny
은 Optional
을 반환합니다. 그것을 사용하는 방법을 모른다면 몇 가지 조사를 해보십시오. 발견 된 주소에서 이메일 주소를 얻는 깨끗한 해결책으로 여기에 사용됩니다. 찾지 못하면 빈 문자열이 반환됩니다.
여전히을 할 :
- 는
- 어쩌면 클래스와의
hasWorkEmail
및 getEmailAddress
를 넣어이 클래스 또는 WorkerType
클래스 중 하나 방법으로 추출하여 긴 게터 체인을 청소 static 메소드는 EmailAddressInformationDataType
을 수신합니다. EmailAddress
클래스의 이름을 지정하면 EmailAddress:hasWorkMail
을 쓸 수 있습니다.이 값은 더 짧고 읽기 쉽습니다. 는
은 EmailAddressInformationDataType
EmailAddressInformationDataType
에 hasWorkEmail()
방법이 새로운 방법은 hasWorkEmail()
라고했습니다
public boolean hasWorkEmail() {
return getUsageDatas().stream()
.filter(CommunicationMethodUsageInformationDataType::isPublic)
.anyMatch(CommunicationMethodUsageInformationDataType::hasWorkEmail);
}
들이 생성되기 때문에 당신이보고는 -DataType
클래스를 조정할 수없는 경우 이전주의 사항 : EmailAddressInformationDataType
을 허용하는 메서드로 정적 클래스 EmailAddress
으로 이동하십시오. 여기에 사용 된 isPublic
메서드는 기존의 메서드입니다. isPublic
및 hasWorkEmail
을 CommunicationMethodUsage
과 같이 더 짧은 이름의 정적 방법으로 다시 이동시켜야합니다. 모든 상용구 접미사는 그대로 둡니다.
여기 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()));
}
; 코드를 다시 작성하고 나머지 코드베이스를 동일한 방식으로 다루는 방법에 대한 명확한 시작을 제공해야합니다.
1) 'peek'을 사용하여 값을 가져 오지 말고 터미널 연산자를 사용하십시오. 'findFirst(). orElse (...)'2) 범위를 작아지면서 정보를 잃어 버리는 동안 모든 것을 flatMap하지 말고 대신 원래의 사용 목록을 스트리밍하십시오. 당신이 필터를 필요로한다면 내부 루프가 필요하고 자체 스트림을 설정하고 특정 검사를 수행하는 다른 메소드에 위임하십시오. –
팁 주셔서 감사합니다. 그러나 이것을 어떻게 할 수 있는지 보여 줄 수 있습니까? – user293655