Как объединить два списка строк в один список без дублирования в потоке Java8 - PullRequest
0 голосов
/ 25 апреля 2020

Здесь у меня есть два списка элементов, которые я хочу объединить в один список и удалить дубликаты перед сохранением в базе данных. Но я получаю сообщение об ошибке, что «на метод non-stati c нельзя ссылаться из контекста stati c». Хотя я знаю значение этого сообщения, я не знаю, как решить его в этом контексте Java8 Stream. Пожалуйста, помогите.

 public void addItems(String shopId, List<String>itemsToAdd, String adminId) {
    final Shop  shop = shopSrevice.getShopById(shopId);
    final Optional<List<String>> currentItems= shop.getCurrentItems();
    if (currentItems.isPresent()){
        List<String> allItems = Stream.of(currentItems,itemsToAdd)
                .flatMap(Collection::stream)
                .collect(Collectors.toList());

Вот снимок сообщения об ошибке

Ответы [ 3 ]

0 голосов
/ 25 апреля 2020

currentItems - это не List, а Optional, поэтому последующие методы не имеют смысла. Разверните Optional и, следовательно, currentItems.isPresent() можно опустить. Метод Stream::distinct обеспечивает уникальные предметы (или вместо него используется Set):

final Shop  shop = shopSrevice.getShopById(shopId);
final Optional<List<String>> currentItems= shop.getCurrentItems();
final List<String> currentItemsList = currentItems.orElse(Collections.emptyList());

List<String> allItems = Stream.of(currentItemsList, itemsToAdd)
     .flatMap(Collection::stream)
     .distinct()
     .collect(Collectors.toList());
0 голосов
/ 25 апреля 2020

Проблема в том, что вы пытаетесь создать поток из необязательного списка и списка. Вызов get() для currentItems решает эту ошибку, и это не должно быть проблемой, поскольку вы уже проверяете, присутствует ли она.

0 голосов
/ 25 апреля 2020

Использование distinct()

Stream.of(currentItems.get(),itemsToAdd)
        .flatMap(List::stream)
        .distinct()
        .collect(Collectors.toList());
...