如何将其转换为lambda
我有这张名单(为可怕的代码道歉) 我怎样才能把这个藏到Lambda里如何将其转换为lambda,lambda,java-8,java-stream,Lambda,Java 8,Java Stream,我有这张名单(为可怕的代码道歉) 我怎样才能把这个藏到Lambda里 List<EmailAddressInformationDataType> emailInfoDataList = workerType.getWorkerData().getPersonalData().getContactData().getEmailAddressDatas(); for(EmailAddressInformationDataType infoData : emailInfoDataList
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
findAny
- 将流保持在
级别,以便在找到任何电子邮件地址时从中获取电子邮件地址EmailAddressInformationDataType
- 委托检查,查看用户是否有适当的类的工作地址,以获得适当的封装和更干净的代码
getEmail()
方法
从顶部开始,如果找到工作电子邮件地址,我们需要一个返回电子邮件地址的方法,如果没有,我们只返回一个空字符串:
private String getEmail() {
return workerType.getWorkerData().getPersonalData().getContactData().getEmailAddressDatas().stream()
.filter(EmailAddressInformationDataType::hasWorkEmail)
.findAny()
.map(EmailAddressInformationDataType::getEmailAddress)
.orElse("");
}
注意findAny
返回一个可选的。如果您不知道如何使用它,请进行一些研究,这里使用它作为一个干净的解决方案,从找到的EmailAddressInformationDataType
获取电子邮件地址,或者,如果没有找到,则返回空字符串
仍然要做:
- 通过将长getter链提取到此类或
WorkerType
类中的方法来清理它
- 可以将
hasWorkEmail
和getEmailAddress
作为接收EmailAddressInformationDataType
的静态方法放在类中。如果将类命名为EmailAddress
,则可以编写EmailAddress:hasWorkMail
,它较短且易于阅读
在EmailAddressInformationDataType
上的hasWorkEmail()
方法
EmailAddressInformationDataType
有一个名为hasWorkEmail()
的新方法:
如果您无法调整-DataType
类,因为它们是生成的,请查看前面的备注:使用接受EmailAddressInformationDataType
的方法将它们移动到静态类EmailAddress
。请注意,此处使用的isPublic
方法仅为现有方法。您可以将isPublic
和hasWorkEmail
再次移动到一个名称较短的静态方法,例如communicationmethodage
,保留所有样板后缀
通信方法数据类型上的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)不要将所有内容平面化,因为随着范围越来越小,你正在丢失信息,流式处理usageDatas的原始列表,如果您需要一个需要内部循环的过滤器,请委托给另一个方法,该方法将设置自己的流,并执行特定的检查谢谢提示。但是你能给我举个例子吗?
public boolean hasWorkEmail() {
return getUsageDatas().stream()
.filter(CommunicationMethodUsageInformationDataType::isPublic)
.anyMatch(CommunicationMethodUsageInformationDataType::hasWorkEmail);
}
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()));
}