Наши объекты имеют «свойства»; и их текущее состояние представлено как Map<String, Object>
, где ключ напоминает имя свойства. Значения могут иметь разные типы, но моя текущая задача имеет дело только со свойствами Boolean .
Помимо текущего статуса, с помощью таких карт также организуются «обновления» объектов.
Теперь я должен предотвратить отключение свойства, которое в настоящее время true
(превращено в false
).
Используя потоки, это работает:
Set<String> currentlyEnabled = currentObjectPropertiesMap.
.entrySet()
.stream()
.filter(e -> Boolean.TRUE.equals(e.getValue()))
.map(Entry::getKey)
.collect(Collectors.toSet());
Set<String> goingDisabled = updatedObjectPropertiesMap
.entrySet()
.stream()
.filter(e -> Boolean.FALSE.equals(e.getValue()))
.map(Entry::getKey)
.collect(Collectors.toSet());
currentlyEnabled.retainAll(goingDisabled);
if (currentlyEnabled.isEmpty()) {
return;
} else {
throw new SomeExceptionThatKnowsAllBadProperties(currentlyEnabled);
}
Приведенный выше код сначала выбирает набор всех свойств, которые true
, затем он отдельно собирает все свойства, которые получат false
. И если пересечение этих двух множеств пусто, у меня все нормально, иначе ошибка.
Вышеописанное работает, но я нахожу это неуклюжим, и мне не нравится тот факт, что набор currentlyEnabled
неправильно используется для вычисления пересечения.
Есть какие-нибудь предположения о том, как это можно сделать более идиоматичным, но читабельным способом "потоковой передачи"?