Вы можете попробовать следующим образом:
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();
Предполагаю, что у вас есть метаданные с идентификатором человека, иначе вы получите NullPointerException
.
Кажется, что в настоящее время ведет себя как ожидалось.
Вся проблема обсуждалась на быстрых форумах: Назначение себя в расширениях протокола
В последний раз, когда эта странность возникала во внутренних дискуссиях, некоторые у нас было то, что, возможно, стоило бы запретить классам соответствовать протоколам с изменяющимися требованиями в целом. Если задуматься, это имеет некоторый смысл - кажется, что было бы довольно сложно написать код, который может работать как с изменяемыми значениями, так и с изменяемыми ссылками в целом, поскольку последние не имеют семантики значений:
[110 ]Однако дискуссия как бы провалилась.
BLOCKQUOTE>