有没有办法在流式传输列表时检查条件



我有一个 Person 实体,它有一个字段 contactType。 现在根据联系人类型,我想将列表映射到不同的资源文件,即WorkContactResource或HomeContactResource.我将使用java 8。

workContact=personList.stream().filter(p->p.getPhoneType == PhoneType.WORK).map(WorkResource::new).collect(Collectors.toList());
homeContact=personList.stream().filter(p->p.getPhoneType == PhoneType.HOME).map(HomeResource::new).collect(Collectors.toList());

工作联系人.添加全部(首页联系方式);

我做了两个不同的列表。 但我想要的是,在流式传输人员列表时,我会检查联系人类型是家庭还是工作,并且只映射到特定资源。 如何实现这一点。

我相信应该是这样的

abstract class Resource {   
}
class WorkResource extends Resource {
public WorkResource(Person person) {
***********
}
}
class HomeResource extends Resource {
public HomeResource(Person person) {
***********
}
}
Map<PhoneType, List<Resource>> contacts = personList.stream().collect(Collectors.groupingBy(p->p.getPhoneType, Collectors.mapping(Resource::new)));

然后按类型循环访问地图

鉴于你想要一个列表作为输出,最巧妙的方法可能是创建一个方法来执行此操作并引用它:.map(this::asResource)

public Resource asResource(Person person) {
if (person.getPhoneType() == PhoneType.WORK) {
return new WorkResource(person);
} else {
return new HomeResource(person);
}
}

这将使您的代码如下所示:

personList.stream()
.map(this::asResource)
.collect(toList());

您也可以在另一个类中将该方法声明为静态,以便用法看起来像这样PersonConverter::asResource

最新更新