Javadoc для функции Stream.reduce
с аргументом идентификации говорит:
Значение идентификации должно быть идентификатором для функции аккумулятора.Это означает, что для всех t, аккумулятора.apply (identity, t) равно t.
Что явно не так - "x".concat(anything)
не равно anything
.Единственное действительное значение идентификатора здесь - ""
.
Если вы проверили предпосылку заголовка вашего вопроса - увидев, что возвращает непараллельная операция - вы увидитечто ответ на ваш заголовок - «нет» - потому что непараллельный поток возвращает "xAEIOU"
для вашей операции сокращения.
Если вы измените значение идентификатора с "x"
на ""
, тогда ответбыло бы «да, такая гарантия есть, так как ваша функция приведения является ассоциативной и ограничения на значение идентификатора также выполняются».
Даже с вашим измененным заголовком ответ таков:clear:
Вы нарушаете контракт функции reduce
, предоставляя в качестве значения идентификатора значение, которое не является значением идентификатора для вашей функции Reduce.Таким образом, поскольку вы нарушаете контракт методов reduce
, все гарантии отключены.
Легко создать случай, когда он не выполняется;просто увеличьте свой список, как уже отмечал Хольгер:
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");
}