Эффективный способ получения набора списков, поиска их общих элементов и сортировки результатов с использованием потоков Java 8 - PullRequest
0 голосов
/ 02 сентября 2018

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

Set<List<SearchResult>> searchResults = new HashSet<>();
…
return searchResults.stream()
    .reduce((sr1, sr2) -> {
        sr1.retainAll(sr2);
        return sr1;
    })
    .get().stream()
    .sorted(Comparator.comparing(SearchResult::getDocno))
    .collect(Collectors.toList());

Я транслирую Сет, нахожу пересечение с retainAll() - пока все хорошо. Но тогда Optional.get() нужно снова транслировать, чтобы я мог его отсортировать. Это не кажется правильным. Кроме того, моя IDE предполагает, что мне нужна проверка isPresent(), но я не уверен, как это сделать.

Примечание: я могу легко сделать это с помощью циклов, но мне больше интересно научиться работать с потоками.

1 Ответ

0 голосов
/ 02 сентября 2018

Вы были очень близки ИМО, просто reduce нужно постоянно возвращать новый объект:

searchResults
            .stream()
            .reduce((left, right) -> {
                List<SearchResult> list = new ArrayList<>(left);
                list.retainAll(right);
                return list;
            })
            .orElse(Collections.emptyList())
            .stream()
            .sorted(Comparator.comparing(SearchResult::getDocno))
            .collect(Collectors.toList());
...