繁体   English   中英

Java8 Stream循环迭代

[英]Java8 Stream loop iteration

请有人帮我在Java8 streamAPI中做到这一点,

for(ContactDto contact : contactList){
    for(ContactContactTypeDto contactType : contact.getContactTypes()){
        if(PRIMARY_CONTACT.equals(contactType.getIdContactTypeCode())){
            StringBuilder contactNameSB = new StringBuilder(contact.getFirstName());
            contactNameSB.append(" ");
            if(null!=contact.getMiddleName() && !contact.getMiddleName().isEmpty()){
                contactNameSB.append(contact.getMiddleName());
                contactNameSB.append(" ");
            }
            contactNameSB.append(contact.getLastName());

            contactName = contactNameSB.toString();
            contactEmail = contact.getEmailAddress();
        }
    }
}

我尝试过,但我只能到达

contactList.stream()
    .filter(contact -> contact.getContactTypes()
        .stream()
        .anyMatch(contactType -> PRIMARY_CONTACT.equals(contactType.getIdContactTypeCode())));

当使用java 8流的代码进行复杂化时,创建一些其他类型和方法是有益的。 例如

一种从它的部分创建全名的方法(在这种情况下,你不需要StringBuilder ,编译器将使用一个):

String createFullName(ContactDto contact) {
    String contactName = contact.getFirstName() + " ";
    if (null != contact.getMiddleName() && !contact.getMiddleName().isEmpty()) {
        contactName += contact.getMiddleName() + " ";
    }
    return contactName + contact.getLastName();
}

一个保存结果的类,基本上是一对名称和电子邮件(添加构造函数,getter等):

class Contact {
    private String name;
    private String email;
}

现在代码变得更加简单:

Optional<Contact> contact = contactList.stream()
        .filter(c -> c.getContactTypes()
                .stream()
                .map(ContactContactTypeDto::getIdContactTypeCode)
                .anyMatch(PRIMARY_CONTACT::equals))
        .findFirst()
        .map(c -> new Contact(createFullName(c), c.getEmailAddress()));

你做了什么后,额外的代码是使用FindFirst这将返回一个可选的描述此流的第一个元素;如果流为空,空可选。

最后一张地图将应用于生成的Optional<ContactDTO>如果它不为空以创建一个Contact或者返回一个空的Optional<Contact>

使用Stream管道获取您希望从中提取详细信息的单个ContactDto可能是有意义的:

ContactDto contact =
    contactList.stream()
               .filter(c -> c.getContactTypes()
                             .stream()
                             .anyMatch(t->PRIMARY_CONTACT.equals(t.getIdContactTypeCode())))
               .findFirst()
               .orElse(null);

然后使用该实例为两个变量分配所需的值:

if (contact != null) {
    StringBuilder contactNameSB = new StringBuilder(contact.getFirstName());
    contactNameSB.append(" ");
    if(null!=contact.getMiddleName() && !contact.getMiddleName().isEmpty()) {
        contactNameSB.append(contact.getMiddleName());
        contactNameSB.append(" ");
    }
    contactName = contactNameSB.toString();
    contactEmail = contact.getEmailAddress();
}

注意:

这将根据找到的第一个匹配的ContactDto实例分配值。

List<ContactDto> contactListWithPrimaryContact = contactList.stream()
                .filter(contact -> contact.getContactTypeDto().parallelStream()
                        .anyMatch(x -> x.getIdContactTypeCode().equals(PRIMARY_CONTACT)))
                .collect(Collectors.toList());

获取所有具有primaryContact类型的联系人后,执行您想要的操作。

第一次接触类型为PRIMARY_CONTACT并为全局变量赋值,似乎没用。

因为按照上面的解决方案,将listType中的第二个联系人作为PRIMARY,我们忽略了它。

List<String> listOfPrimaryEmailAddresses = contactList.stream()
                                                      .filter(primaryContactPredicate())
                                                      .map(ContactDto::getEmailAddress)
                                                      .collect(Collectors.toList());


List<String> primaryContactNamesList = contactList.stream()
                                                  .filter(primaryContactPredicate())
                                                  .map(ContactDto::getFullName)
                                                  .collect(Collectors.toList());

private Predicate<ContactDto> primaryContactPredicate() {
        return contact -> contact.getContactTypes().stream().anyMatch(contactType -> PRIMARY_CONTACT.equals(contactType.getIdContactTypeCode()));
}

在ContactDto类中为getFullName()添加方法

public String getFullName() {
        if (null != getMiddleName() && !getMiddleName().isEmpty()) {
            return getFirstName() + " " + getMiddleName() + " " + getLastName();
        }
        return getFirstName() + " " + getLastName();
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM