使用Java 8流获取列表集,找到它们的通用元素并对结果进行排序的有效方法

时间:2018-09-02 16:39:59

标签: java-8 java-stream

我对这是如何工作的有一个想法,但是似乎必须有一种更优雅的方法。

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());

我正在流处理Set,找到与retainAll()的交集-到目前为止,一切都很好。但是然后Optional.get()需要再次流式传输,以便我对其进行排序。那似乎不对。另外,我的IDE建议我需要进行isPresent()检查,但不确定如何将其插入。

注意:我可以轻松地使用循环来完成此操作,但是我对学习使用流更感兴趣。

1 个答案:

答案 0 :(得分:3)

您与IMO非常接近,只是reduce需要一直返回一个新的Object:

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());