Est-il pas garanti qu'un flux parallèle dérivé d'une liste toujours se comporter comme son homologue séquentiel donnant la même, la sortie prévisible?

Treefish Zhang:

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?

Erwin Bolwidt:

Le Javadoc pour la Stream.reducefonction 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 reducefonction 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 reducemé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");
}

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=175734&siteId=1
conseillé
Classement