Reconception de la méthode pour utiliser Java 8 Map.computeIfAbsent () avec une exception levée

J’essaie de retravailler certaines de mes méthodes pour les rendre plus concises avec Java 8, dont j’essaie d’intégrer les nouvelles fonctionnalités.

C’est une méthode qui a pour but d’append une value à un object Map<Key, Set> . Il y a trois possibilités:

  1. La clé n’existe pas: elle est ajoutée et un nouvel ensemble contenant la valeur lui est associée.
  2. La clé existe: la valeur est ajoutée à l’ensemble existant. Notez qu’un ensemble ne sera jamais null , car j’ai certaines conditions préalables pour y faire face.
  3. La clé existe et la valeur est déjà contenue dans le jeu: une IllegalArgumentException est levée.

Le code implémentant ce comportement est le suivant et n’utilise pas les fonctionnalités de Java 8:

 public void addValue(Key key, Value value) { // irrelevant preconditions... Set valuesForKey = myMap.get(key); if (valuesForKey != null && valuesForKey.contains(value)) throw new IllegalArgumentException("Association exists already"); if (valuesForKey == null) myMap.put(key, new HashSet(Arrays.asList(value))); else valuesForKey.add(value); } 

J’aimerais raccourcir ce code en utilisant des méthodes Java 8 telles que computeIfAbsent .

Je pourrais résumer le dernier bloc if-else , mais je ne peux pas dépasser la redondance de l’ensemble de valeurs auquel la key correspond déjà après avoir été récupérée lors de l’exécution des vérifications de précondition.

 public void addValue(Key key, Value value) { // irrelevant preconditions... Set valuesForKey = myMap.get(key); if (valuesForKey != null && valuesForKey.contains(value)) throw new IllegalArgumentException("Association exists already"); myMap.computeIfAbsent(key, v -> new HashSet()).add(value); } 

Y a-t-il un moyen de fusionner tout cela en une seule instruction?

Vous pouvez tirer parti du fait que la méthode add(element) renverra true si le jeu ne contient pas l’élément spécifié. Si cet appel renvoie false , cela signifie que l’élément n’a pas été ajouté car il était déjà présent. Par conséquent, vous pouvez utiliser:

 public void addValue(Key key, Value value) { boolean added = myMap.computeIfAbsent(key, k -> new HashSet<>()).add(value); if (!added) { throw new IllegalArgumentException("Association exists already"); } }