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