我如何将其转换为lambda

时间:2016-11-25 10:49:17

标签: lambda java-8 java-stream

我有这份清单清单(为可怕的代码道歉) 我如何将其转换为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"))
                         ;

1 个答案:

答案 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
  • 中的方法来清理它
  • 可能会将hasWorkEmailgetEmailAddress作为接收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方法只是现有方法。您可以将isPublichasWorkEmail再次移动到名称较短的静态方法,例如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()));

}

此代码编译和工作;它应该给你一个明确的开始,如何重写代码并以相同的方式处理其余的代码库。