Le code suivant imprime vrai pour 100 fois:
for(int i=0; i<100; i++) {
String s2 = Arrays.asList("A", "E", "I", "O", "U").parallelStream().reduce("x", String::concat, String::concat);
System.out.println("xAxExIxOxU".equals(s2));
}
Certes, 100 fois ne sont pas une garantie. Mais ne pas semble cependant que , même si l'identité utilisée ici ne répond pas à l'exigence de « ... pour tout u, combiner.apply (identité, u) est égale à u » par le doc , on peut dire encore qu'un flux parallèle dérivé d'une liste ou toute autre structure ordonnée par nature se comportera comme un flux séquentiel de réduire () retournant la même sortie?
Le Javadoc pour la Stream.reduce
fonction avec un argument identitaire dit:
La valeur d'identité doit être une identité pour la fonction de l'accumulateur. Cela signifie que pour tout t, accumulator.apply (identité, t) est égal à t.
Ce qui est clairement pas le cas ici - "x".concat(anything)
ne correspond pas à anything
. La seule valeur d'identité valide est ici ""
.
Si vous avez testé la prémisse du titre de votre question - en voyant ce que un rendement de fonctionnement non parallèles - vous verriez que la réponse à votre titre est « non » - car un rendement de flux non parallèles "xAEIOU"
pour votre réduire le fonctionnement.
Si vous modifiez la valeur d'identité de "x"
la ""
, alors la réponse serait « oui, il y a une telle garantie, comme une réduction des fonctions est associative et les contraintes qui pèsent sur la valeur d'identité sont également satisfaits. »
Même avec votre titre modifié, la réponse est claire:
Vous violez le contrat de la reduce
fonction en fournissant, comme la valeur d'identité, une valeur qui est pas une valeur d'identité pour votre réduire la fonction. En tant que tel, puisque vous violez le contrat des reduce
méthodes, toutes les garanties sont éteintes.
Il est facile de créer un cas où il ne tient pas; juste faire votre liste plus comme Holger à déjà souligné:
List<String> list = new ArrayList<>();
for (int i = 0; i < 500; i++) {
list.add("A");
}
String s2 = list.parallelStream().reduce("x", String::concat, String::concat);
System.out.println(s2);
if (s2.length() != list.size() * 2) {
System.out.println("Bad s2 size");
}