Как отфильтровать Hashmap для обновления значения на лету, используя поток Java 8? - PullRequest
0 голосов
/ 02 ноября 2019

У меня есть сценарий, и я не уверен, что может быть эффективным способом фильтрации hashmap и обновления той же карты. Вот мой hashmap;Map<Double, List<Product>> mappedProducts = new HashMap<>(); Я выложил ключи и значения в mappedProducts некоторым способом. Теперь в другом методе я пытаюсь отфильтровать список продуктов, основываясь на том, больше ли значение моего ключа, чем вес свойства продукта. Вот как я это сделал, хотя он прекрасно работает, но я не уверен, является ли это наиболее эффективным и действенным способом сделать это. Взгляните на следующий код:

this.mappedProducts.entrySet().stream().filter(packList ->{
        mappedProducts.put(packList.getKey(), packList.getValue().stream().filter(pack ->{
                if(pack.getWeight() <= packList.getKey())
                    return true;
                return false;
        }).collect(Collectors.toList()));
        return true;
    }).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
System.out.println("Filtered Products"+mappedProducts);

Есть ли другой лучший способ сделать это?

1 Ответ

3 голосов
/ 02 ноября 2019

Если вы хотите отфильтрованную новую карту: Сохраните записи, где вес всех продуктов меньше, чем ключ

Map<Double, List<Product>> filtered = mappedProducts.entrySet()
        .stream()
        .filter(packList -> packList.getValue().stream().allMatch(pack -> pack.getWeight() < packList.getKey()))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

Если вы хотите изменить основную карту: Удалите все записи, где вес одного продукта превышает значение ключа

mappedProducts.entrySet()
              .removeIf(packList -> packList.getValue().stream().anyMatch(pack -> pack.getWeight() > packList.getKey()));
...