Фильтрация списка объектов с использованием Java 8 и отображение отфильтрованных результатов обратно в тот же список - PullRequest
0 голосов
/ 09 октября 2019

У меня есть список, содержащий список объектов, и я хочу извлечь из списка только активные записи. Ниже приведен код, который я пытаюсь использовать, но он не фильтруется должным образом.

 private List<SkuList> getActiveSkuListsAndSkuListLineItem(List<SkuListEntity> skuListEntityList) {
return skuListEntityList.stream()
    .filter(x -> x.getStatusTypDbky().getTypDbkey().equals(SkuListStatus.ACTIVE.getId()))
    .map(x -> x.getSkuListLineItems())
    .flatMap(x -> x.stream()
        .filter(s -> s.getStatusTypDbky().getTypDbkey().equals(SkuListLineItemStatus.ACTIVE.getId())))
    .map(x -> x.getSkuListEntity())
    .collect(Collectors.toList())
    .stream().map(x -> skuListMapper.toSkuListResource(x)).collect(Collectors.toList());
}

Приведенный выше код извлекает все записи независимо от состояния фильтра (ACTIVE). Если я нарушу приведенный выше код, как показано ниже:

skuListEntityList = skuListEntityList.stream()
        .filter(x -> x.getStatusTypDbky().getTypDbkey().equals(SkuListStatus.ACTIVE.getId()))
        .collect(Collectors.toList());

 List<SkuListLineItemEntity> skuListLineItemEntityList = skuListEntityList.stream()
    .flatMap(x -> x.getSkuListLineItems().stream()
        .filter(s -> s.getStatusTypDbky().getTypDbkey().equals(SkuListLineItemStatus.ACTIVE.getId())))
    .collect(Collectors.toList());

, тогда объекты skuListEntityList и skuListLineItemEntityList содержат только активные записи. Что не так, я делаю выше, когда я объединил логику в одном выражении возврата.

1 Ответ

0 голосов
/ 09 октября 2019

Трудно протестировать ваш код без реальных классов, но в вашем первом потоке много шума.

Ниже приведен исходный код с добавленными комментариями, который, мы надеемся, уберет часть добавленного вами дополнительного шума.

return skuListEntityList.stream()
    .filter(x -> x.getStatusTypDbky().getTypDbkey().equals(SkuListStatus.ACTIVE.getId()))
    .map(x -> x.getSkuListLineItems())
    .flatMap(x -> x.stream()
        .filter(s -> s.getStatusTypDbky().getTypDbkey().equals(SkuListLineItemStatus.ACTIVE.getId())))
    .map(x -> x.getSkuListEntity())//remove and simply operate on x below
    .collect(Collectors.toList())//This is not needed as you're already working with a stream
    .stream()//This is not needed as you're already working with a stream
    .map(x -> skuListMapper.toSkuListResource(x/*x.getSkuListEntity() remove map above*/)).collect(Collectors.toList());

Ваш ответ должен выглядеть примерно так. Хотя без выделенных классов я не могу гарантировать, что ваша логика работает так, как вы намереваетесь.

        return skuListEntityList.stream()
                .filter(x -> x.getStatusTypDbky().getTypDbkey().equals(SkuListStatus.ACTIVE.getId()))
                .flatMap(x -> x.getSkuListLineItems().stream())
                .filter(s -> s.getStatusTypDbky().getTypDbkey().equals(SkuListLineItemStatus.ACTIVE.getId()))
                .map(x -> skuListMapper.toSkuListResource(x.getSkuListEntity()))
                .collect(Collectors.toList());

Я бы предложил прочитать https://www.baeldung.com/java-difference-map-and-flatmap и https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html Чтобы точно понятьчто вы делаете в каждой промежуточной операции.

Если вы не совсем понимаете, что именно происходит, удалите цепочку методов и используйте отладчик, чтобы увидеть фактическое возвращаемое значение из вызовов.

т.е. 1019 *

Stream<SkuListEntity> skuListEntityStream = skuListEntityList.stream();
Stream<SkuListEntity> filteredSkuListEntityStream = skuListEntityStream.filter();
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...