3 回答
![?](http://img1.sycdn.imooc.com/545847f50001126402200220-100-100.jpg)
TA贡献1818条经验 获得超8个赞
YCF_L的解决方案应该可以使用,但是它是O(n 2)解决方案。O(n)解决方案可以通过将一个列表转换为从id到对象的映射,然后在另一个列表上进行迭代并从映射中获取匹配值来实现:
Map<Integer, Person> personMap =
persons.stream().collect(Collectors.toMap(Person::getId, Function.identity());
List<PersonWithMetadata> result =
metadata.stream()
.map(m -> new PersonWithMetadata(personMap.get(m.getId()), m)
.collect(Collectors.toList());
在示例数据中,列表具有匹配顺序的匹配对象。如果此假设也适用于实际问题,则解决方案可能必须更简单-您可以流式传输索引并从列表中获取相应的值:
List<PersonWithMetadata> result =
IntStream.reange(0, persons.size())
.map(i -> new PersonWithMetadata(persons.get(i), metadata.get(i))
.collect(Collectors.toList());
![?](http://img1.sycdn.imooc.com/5333a1bc00014e8302000200-100-100.jpg)
TA贡献1876条经验 获得超7个赞
您可以这样尝试:
List<PersonWithMetadata> personsAndMEtadata = persons.stream()
.map(p -> {
//search for the meta data based on the person id
Metadata meta = metadata.stream()
.filter(m -> m.getId() == p.getId())
.findFirst()
.get();
// then create a PersonWithMetadata object based on Person and metadata
return new PersonWithMetadata(
p.getId(), p.getFirstName(), p.getLastName(),
meta.getDate(), meta.getCity(), meta.getJob()
);
}
).collect(Collectors.toList());
关于这条线:
Metadata meta = metadata.stream().filter(m -> m.getId() == p.getId()).findFirst().get();
我假设您有一个id为person的元数据,否则您将得到NullPointerException。
添加回答
举报