簡體   English   中英

Java通過通用值合並流

[英]Java merging streams by common value

我有這樣的方法:

private X findMatchingValuesInStream(Stream<DocumentDto> a, Stream<FolderDto> b) {
    // TODO: return Pairs matched by documentDto.url and folderDto.url
}

我知道按url字段只有一個匹配項,我想返回一個具有匹配項的對。

因此,例如,如果我們設置了documentDtourl="asasa"並設置了其他字段,而folderDto設置了url="asasa"並設置了其他字段,我想返回此元素對。

最后,我的方法將返回這些元素的List

我不確定如何使用流嗎? 我嘗試了類似的東西:

    a.filter(c -> b.anyMatch(d -> d.getUrl().equals(c.getUrl())))

但是我不知道如何用cd來創建Pair

不要使用流作為輸入。 流不是您數據的持有人。 而是將它們用作處理數據的手段。

另一點要考慮的是,流不是Iterable ,你將無法遍歷它。 Collection接口是Iterable的子類型,並具有stream方法,因此它提供迭代和流訪問。 因此,對於公共方法,Collection或適當的子類型通常是最佳的返回/輸入類型。

首先使用文件夾創建一個地圖,其中key是url,值是folderDto。 然后為每個文檔查找地圖以獲取匹配的文件夾實例,然后創建對。 我使用Map.Entry作為Pair的更好替代。 如果您更喜歡Pair ,則可以只替換它。

這是它的外觀。

private List<Entry<DocumentDto, FolderDto>> findMatchingValuesInStream(Collection<DocumentDto> a, Collection<FolderDto> b) {
    Map<String, FolderDto> folderByUrl = b.stream()
        .collect(Collectors.toMap(FolderDto::getUrl, Function.identity()));
    return a.stream()
        .map(d -> new AbstractMap.SimpleEntry<>(d, folderByUrl.get(d.getUrl())))
        .collect(Collectors.toList());
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM