Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将其转换为lambda_Lambda_Java 8_Java Stream - Fatal编程技术网

如何将其转换为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

我有这张名单(为可怕的代码道歉) 我怎样才能把这个藏到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;
                        }
                    }
                }

            }
        }

摘要

两件事:

  • 使用终端操作员而不是
    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()));

}