[英]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.