我有这份清单清单(为可怕的代码道歉) 我如何将其转换为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;
}
}
}
}
}
我尝试了以下内容,但仍然无法收到电子邮件:
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
,查找我们将使用的任何电子邮件地址findAny
EmailAddressInformationDataType
级别,以便在找到任何内容时从中获取电子邮件地址 您的getEmail()
方法
从顶部开始,如果找到工作电子邮件地址,我们需要一个返回电子邮件地址的方法,如果不是,我们只返回一个空字符串:
private String getEmail() {
return workerType.getWorkerData().getPersonalData().getContactData().getEmailAddressDatas().stream()
.filter(EmailAddressInformationDataType::hasWorkEmail)
.findAny()
.map(EmailAddressInformationDataType::getEmailAddress)
.orElse("");
}
备注findAny
返回Optional
。如果你不知道如何使用它,做一些研究,它在这里用作一个干净的解决方案,从找到的EmailAddressInformationDataType
获取电子邮件地址,或者如果没有找到,则为空返回字符串。
仍然要做:
WorkerType
类hasWorkEmail
和getEmailAddress
作为接收EmailAddressInformationDataType
的静态方法放在一个类中。如果您将课程命名为EmailAddress
,则可以编写EmailAddress:hasWorkMail
,这篇文章更短,更容易阅读。 hasWorkEmail()
EmailAddressInformationDataType
方法
EmailAddressInformationDataType
有一个名为hasWorkEmail()
的新方法:
public boolean hasWorkEmail() {
return getUsageDatas().stream()
.filter(CommunicationMethodUsageInformationDataType::isPublic)
.anyMatch(CommunicationMethodUsageInformationDataType::hasWorkEmail);
}
如果由于生成-DataType
类而无法调整EmailAddress
类,请查看之前的注释:使用接受{{1}的方法将它们移动到静态类EmailAddressInformationDataType
}。请注意,此处使用的isPublic
方法只是现有方法。您可以将isPublic
和hasWorkEmail
再次移动到名称较短的静态方法,例如CommunicationMethodUsage
,将所有样板后缀留下。
hasWorkEmail()
CommunicationMethodUsageInformationDataType
方法
这里的故事,带有映射和过滤器的简单流。我们使用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()));
}
此代码编译和工作;它应该给你一个明确的开始,如何重写代码并以相同的方式处理其余的代码库。