按字段搜索不同 类 和不同列表 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());
我有三个不同的列表,其中包含不同的对象。我需要遍历每个列表,比较一个字段,如果相同,则创建新对象。
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());