3 回答

TA貢獻1818條經(jīng)驗 獲得超8個贊
YCF_L的解決方案應該可以使用,但是它是O(n 2)解決方案。O(n)解決方案可以通過將一個列表轉(zhuǎn)換為從id到對象的映射,然后在另一個列表上進行迭代并從映射中獲取匹配值來實現(xiàn):
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());
在示例數(shù)據(jù)中,列表具有匹配順序的匹配對象。如果此假設也適用于實際問題,則解決方案可能必須更簡單-您可以流式傳輸索引并從列表中獲取相應的值:
List<PersonWithMetadata> result =
IntStream.reange(0, persons.size())
.map(i -> new PersonWithMetadata(persons.get(i), metadata.get(i))
.collect(Collectors.toList());

TA貢獻1876條經(jīng)驗 獲得超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());
關(guān)于這條線:
Metadata meta = metadata.stream().filter(m -> m.getId() == p.getId()).findFirst().get();
我假設您有一個id為person的元數(shù)據(jù),否則您將得到NullPointerException。
添加回答
舉報