flux d'entrée:
Stream.of(1, 3, 6, 10)
3 Réponses :
Comme d'autres ont déclaré (et je me sens obligé d'ajouter) est que ce n'est pas une bonne pratique. Dans des cas comme celui-ci, un Le problème principal avec ceci est, que tous les flux ne sont pas nécessaires pour être séquentiels ou commandé. Un flux parallèle peut ne pas gérer les résultats dans l'ordre attendu et les dégâts des objets. Votre façon de créer le flux code> code> suggère que vous avez un flux séquentiel, alors je suppose que vous le laissez de cette façon. Ensuite, une solution possible peut être la suivante: p> pour code> -Loop est préférable, sauf si vous utilisez des flux en tant que types de retour ou paramètres.
attenduetream code> est maintenant un flux fournissant des éléments
{1, 3, 6, 10} Code> Comme prévu, n'assumant aucun intermédiaire extérieur avec le
somme code>.
Cette solution s'appuie sur la solution de contournement, que les valeurs externes (bien que requises pour être effectivement finales) puissent être modifiées indirectement par référence. Vous pouvez aussi bien utiliser un tableau
int [1] code>. P> p>
Je suis précédemment écrit Sum.getandAdd code> qui est incorrect. S'il vous plaît soyez conscient du changement!
Le flux référencé par attendu code> est pas i> "un flux de
{1, 3, 6, 10} code>". C'est un flux qui encapsulant un comportement i> qui n'a pas encore eu lieu. Considérez simplement ce qui se passe, lorsque j'appelle
sum.set (42) code> après cela, mais avant que
attendu, code> est utilisé. Vous n'avez pas besoin de pointer vers le traitement parallèle, par exemple des utilisations qui peuvent le casser. Que se passe-t-il lorsque vous utilisez, par exemple
.skip (3) .foreseach (system.out :: println) code>? Avec la mise en œuvre actuelle i>, il arrive à faire la chose désirée. Continuera-t-il de travailler avec les futures versions ou des futurs JRES? Personne ne sait.
Bien que ce soit vrai, que le flux code> ne contient pas les valeurs
{1, 3, 6, 10} code> (merci pour cette clarification), le
Skip < / CODE> Exemple fonctionne toujours, car le
Ignorer code> n'est appliqué que lorsque les sommes individuelles sont calculées. Il suffit de supposer que ce n'était pas si ... si vous vouliez analyser des lignes d'un fichier et sauter les 10 premiers, vous ne pouviez pas, car le skip optimiserait les 10 premiers accès, ignorant le fait qu'ils pourraient changer externe état, par exemple Un
Inverstream sous-jacent code>. Si vous deviez changer le code, j'ai écrit ou insérez des objets entre les deux, puis bien sûr, vous pouvez casser n'importe quoi.
L'API Stream ne garantit aucune garantie sur l'état de la source. Tout ce qui compte, est ce qui est nécessaire pour fournir le résultat demandé. Bien entendu, lorsque la source traite les lignes d'un fichier, il n'ya aucun moyen de les identifier pour les ignorer. Cela ne s'applique pas à une source d'accès aléatoire comme flux.of (...) code>. Par exemple, lorsque vous chaîne
comptez () code>, le
atomicinteger code> ne se touche pas dans Java 9 ou plus récent, alors qu'il est modifié en Java 8. Il n'y a pas de garantie que le L'effet secondaire se produit et les futures versions peuvent ajouter plus d'optimisations. Il n'est pas difficile d'imaginer un saut plus efficace ...
Nombre CODE> est un bon exemple de comportement changeant entre JDKS. Et j'avoue qu'une possibilité fondamentale existe que code> code> peut changer de telle manière que les résultats de l'extrait ci-dessus peuvent se casser. Je tiens à attendre l'avertissement et prendrai plus grand soin de mon propre code, en ce qui concerne les flux (bien que je les utilise rarement de toute façon).
La réponse est, tout simplement pas. Chaque fois que vous devez garder une trace de quelque chose, par exemple La somme précédente, Pour votre problème, je ne peux pas voir pourquoi vous ne forts> Voulez-vous utiliser une simple boucle. P> flux code> s. Ils ne sont pas faits pour l'état, ils étaient destinés à appliquer simplement certaines conversions et filtres indépendantes à une quantité potentielle d'éléments sans fin.
int[] yourInts = {1, 2, 3, 4};
for(int i = 0, sum = 0; i < yourInts.length; i++) {
sum += yourInts[i];
yourInts[i] = sum;
}
Oui, c'est la meilleure solution - ainsi évitée, mais pas la réponse à la question;)
Si vous savez que le flux est commandé, vous pouvez le faire sans accumulateur. Avec cette formule:
Vous feriez mieux d'utiliser une boucle pour la boucle ici.
Oui, @ernest_k est correct. Cependant, je pense que OP vise la compréhension générale de la façon dont cela pourrait être fait.
Chaque fois que vous avez des effets secondaires avec un ruisseau, qui est pas i> parallèle, alors vous devriez simplement utiliser des boucles pour
Un flux n'est pas une fin en soi. Définir un résultat réel.