Java 8 stream: remplacer l'élément en streaming collection

Je suis un peu nouveau pour Java 8, et je suis refactoring certains anciens de code avec (ce qui semble être un bon cas d'utilisation) d'un flux de l'opération. Le vieux code "fonctionne", mais à mes yeux elle a l'air vraiment inefficace.

La version courte de ma question est que je suis en train de trouver un seul élément d'une Liste et de le remplacer par une version mise à jour de ce même élément (la clé est la même, mais les propriétés ont des valeurs différentes à chaque fois que le code est appelé).

     try
     {
        List<Object> items = lookup(itemCache.getKey());
        for (int i = 0; i < items.size(); i++)
        {
           Object originalObject = items.get(i);
           if (originalObject.getPropValue() == newObject.getPropValue())
           {
              List<Object> newItems = new ArrayList<>(items);
              newItems.set(i, newObject);
              putIntoCache(newObject.getKey(), newItems);
              break;
           }
        }
     } 

     catch (Exception ex) { /*exception handling*/ }

Fondée sur ce que j'ai lu sur les ruisseaux jusqu'à présent, il semble que j'ai besoin d'utiliser un .map() ou .filter() pour isoler l'élément que je veux à identifier, mais qui semble aussi que des opérations survenues après la filter ou map dans le cours d'eau serait d'exploitation sur la Liste non complète ou sur une Liste où chaque élément est affecté par la .map().

Cela semble simple, mais j'ai du mal à envelopper ma tête autour de lui. Parce que la première recherche est un List lui-même, je pensais le flux pourrait remplacer tout cela. Le ArrayList<>() apparaît dans le code d'origine, mais l'ordre des éléments n'a pas d'importance tant que je suis en mesure de remplacer cet article par sa clé.

Si vous choisissez de vous aider, je vous remercie.

  • Les flux ne sont pas appropriées pour les mutations de la source de données.
  • Hors sujet, mais si votre cache met en œuvre Map, vous devriez regarder dans Map.computeIfPresent(UnaryOperator<T>) au lieu de lire le List et de l'écrire dans le cache. Le computeIfAbsent est thread-safe dans un ConcurrentHashMap, à la différence de la lecture-modification-écriture approche adoptée dans ces réponses.
InformationsquelleAutor Patrick | 2016-04-18