У меня есть 3 карты, и они настроены следующим образом: -
//Map1
Map<CatalogCd, Set<ItemUID>> availableItems
//Map2
Map<CatalogCd, FilteringPreferences> filteringPrefs
//Map3
Map<ItemUID, ItemInformation> itemDetailInformation
То, что я пытаюсь сделать, это
пройти через availableItems, а затем посмотреть, если ItemInformation дляданный ItemUID совпадает с предпочтениями (по сути, выполняя некоторую проверку предикатов).
Как видно, первые две карты имеют одинаковые ключи, filteringPrefs для одного и того же ключа применяются ко всему наборуэтот ключ catalogcd, любой объект, который не подходит в соответствии с настройкой предикатов в Предпочтениях, должен быть удален из результирующего набора itemuids.
Я заинтересован в создании способа создания потока java 8, map, filterэто выглядит лучше, чем традиционный цикл for на одной карте, а затем вручную удаляет или добавляет элементы к новой карте результатов.
Это традиционный стиль кода для цикла без java-8, который я получил.
public Map<CatalogCd, Set<ItemUID>> filterResponse(Map<CatalogCd, Set<ItemUID>> availableItems, Map<CatalogCd, FilteringPreferences> filteringPrefs, Map<ItemUID, ItemInformation> itemDetailInformation)
{
Map<CatalogCd, Set<ItemUID>> resultingFilteredItemsMap = new HashMap<>();
for(Map.Entry<CatalogCd,FilteringPreferences> catalogCdEntry : filteringPrefs.entrySet()){
CatalogCd catalogCdInRequest = catalogCdEntry.getKey();
EnumSet<PrefA> prefA = catalogCdEntry.getValue().getSupportedPrefAs();
//get set of items for this catalogcd, loop over each itemuid, check from itemDetailInformation map
//to see if that itemuid's enumset has intersection with the enumset in request's preference.
Set<ItemUID> itemsForThisCatalogCd = availableItems.get(catalogCdInRequest);
for(ItemUID item:itemsForThisCatalogCd){
EnumSet<PrefA> enumSetFromItemInfo = itemDetailInformation.get(item).getPrefAs();
enumSetFromItemInfo.retainAll(prefA);
if(!enumSetFromItemInfo.isEmpty()){
if(resultingFilteredItemsMap.get(catalogCdInRequest)!=null){
Set<ItemUID> items = resultingFilteredItemsMap.get(catalogCdInRequest);
items.add(item);
resultingFilteredItemsMap.put(catalogCdInRequest, items);
}else{
resultingFilteredItemsMap.put(catalogCdInRequest, Sets.newHashSet(item));
}
}
}
}
return resultingFilteredItemsMap;
}
То, что я до сих пор пробовал, таково: -
availableItems
.entrySet()
.stream()
.filter(x- >predicateFilterFactory.createPredicateFilter(filteringPref.get(x.getKey())))
.collect(Collectors.toMap(x->x.getKey(),x->x.getValue));
но это говорит о том, что предикат не может быть преобразован в логическое значение. Также я не знаю, какпривязать фактическую карту содержания к этому.Любая помощь будет отличной.Спасибо