У меня есть список всех списков (извинения за отвратительный код) Как скрыть это от лямбда?Как мне преобразовать это в 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) не используйте 'peek' для получения значения, но используйте оператор терминала, например. 'findFirst(). orElse (...)' 2) не flatMap все, поскольку вы теряете информацию, так как ваша область становится все меньше и меньше, вместо этого поток исходного списка usesDatas и если вам нужен фильтр который нуждается в внутреннем цикле, делегировать другому методу, который будет настраивать собственный поток и выполнить конкретную проверку. –
Спасибо за подсказку. Но не могли бы вы показать мне пример о том, как это сделать? – user293655