按字段搜索不同 类 和不同列表 Java 8 流

Search by field on different classes and different lists Java 8 Stream

我有三个不同的列表,其中包含不同的对象。我需要遍历每个列表,比较一个字段,如果相同,则创建新对象。

ObjectA: firstName, id
ObjectB: email, id 
ObjectC: birthday, id
Model: firstName, email, birthday, id

我能否以某种方式使用流搜索按 ID 搜索对象列表,并在输出时创建包含上述字段的模型列表?

我试过这个:

List<ObjectA> list1;
List<ObjectB> list2;
List<ObjectC> list3;
List<Model> output = list1.stream().flatMap(p -> list2.stream()
                                  .filter(t -> p.getId().equals(t.getId())).findFirst()
                                  .flatMap(t -> list3.stream()
                                  .filter(i -> t.getId().equals(i.getId())).findFirst()
.flatMap(i -> new Model(p, i, t)))) // Model has a constructor, that takes classes as values
.collect(Collectors.toList());

这不适用于流,流适合处理同质数据,但事实并非如此。

第 1 步是将您的列表转换为地图,将 id 映射到相关对象。

然后,带着3张地图,你就可以合并了。首先创建所有 ID 的超集,然后为每个 ID 收集您的数据,并创建您的对象。

类似于:

Map<String, String> as = list1.stream()
  .collect(Collectors.toMap(ObjectA::getId, ObjectA::getName));
Map<String, String> bs = list2.stream()
  .collect(Collectors.toMap(ObjectB::getId, ObjectB::getEmail));
Map<String, LocalDate> cs = list3.stream()
  .collect(Collectors.toMap(ObjectC::getId, ObjectC::getBirthDate));

var allIds = new HashSet<String>();
allIds.addAll(as.keySet());
allIds.addAll(bs.keySet());
allIds.addAll(cs.keySet());

var objs = allIds.stream()
  .map(id -> new ModelObj(id,
     as.getOrDefault(id, "(NoName)"),
     bs.getOrDefault(id, "(NoEmail)"),
     cs.get(id)))
  .collect(Collectors.toList());