Java построить список из двух других списков с разными объектами и общим свойством - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь построить список с общим свойством из двух других списков разных объектов. Я использую библиотеку Stream, но не могу заставить код работать. Вот что я пробовал:

Попытка 1 (возвращается только первый элемент ObjectAList):

private List<ObjectA> getFilteredObjectAList() {

    return ObjectAList.stream()
            .filter(a -> a.getProperty().getPropertyId().equals(
                    (ObjectBList.stream().map(b -> b.getPropertyId())).findAny().orElse(null)))
            .collect(Collectors.toList());
}

Попытка 2 (возникает ошибка "Целевой тип этого выражения должен быть функциональным интерфейсом "):

private List<ObjectA> getFilteredObjectAList() {
     List<ObjectA> list;
     ObjectAList.stream()
     .forEach(a -> a.getProperty().getPropertyId()
     .filter((ObjectBList.stream()
     .map((b -> b.getPropertyId())::contains ? list.add(t) : "".isEmpty())))
     .collect(Collectors.toList()));
     return list;
     }

Ваша помощь очень ценится.

1 Ответ

3 голосов
/ 19 июня 2020

Я думаю, вы хотите вернуть ObjectA экземпляры, где значение getProperty().getPropertyId() существует в некотором списке ObjectB значений.

Ваша первая попытка не работает, потому что она сравнивает getPropertyId каждого ObjectA с getPropertyId случайным ObjectB (потому что вы звоните findAny).

Вы хотите что-то вроде этого:

private List<ObjectA> getFilteredObjectAList() {
    return ObjectAList.stream()
            .filter(a -> ObjectBList.stream().matchAny(b -> b.getPropertyId() ==
                a.getProperty().getPropertyId())
            .collect(Collectors.toList());
}

Однако этот подход может медленнее, если списки большие, потому что вы сканируете список ObjectB один раз на предмет самого члена списка ObjectA. Лучше создать HashSet идентификаторов, которые существуют в списке ObjectB, а затем искать значения из списка ObjectA в этом наборе.

private List<ObjectA> getFilteredObjectAList() {
    Set<String> ids = ObjectBList.stream().map(ObjectB::getPropertyId)
        .collect(Collectors.toCollection(HashSet::new));
    return ObjectAList.stream()
            .filter(a-> ids.contains(a.getProperty().getPropertyId())
            .collect(Collectors.toList());
}
...