[英]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
字段只有一個匹配項,我想返回一個具有匹配項的對。
因此,例如,如果我們設置了documentDto
和url="asasa"
並設置了其他字段,而folderDto
設置了url="asasa"
並設置了其他字段,我想返回此元素對。
最后,我的方法將返回這些元素的List
。
我不確定如何使用流嗎? 我嘗試了類似的東西:
a.filter(c -> b.anyMatch(d -> d.getUrl().equals(c.getUrl())))
但是我不知道如何用c
和d
來創建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.