Java8 Stream循环迭代

时间:2017-06-13 14:48:12

标签: java java-8 java-stream

请有人帮我在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())));

4 个答案:

答案 0 :(得分:3)

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

从其部分创建全名的方法(在这种情况下,编译器将不需要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,如果流为空则返回空的可选。

最后的map将应用于生成的Optional<ContactDTO>,如果它不为空,则创建Contact或者返回空的Optional<Contact>

答案 1 :(得分:2)

使用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实例分配值。

答案 2 :(得分:0)

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,我们忽略了它。

答案 3 :(得分:0)

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();
    }