Как здесь работает изменяемое сокращение, поскольку String является неизменным объектом?
Это не так. При запуске вы получите пустую строку (результат Supplier only
). Компилятор не может принудительно проверить, возвращает ли Поставщик неизменный объект, это абсолютно то, что он не может сделать. А поскольку ваш контейнер неизменен, обновления к нему просто игнорируются. Это как делать:
String s = "abc";
s.concat("def"); // the result is ignored here
Может быть, если вы напишите, что как лямбда, это будет иметь больше смысла:
Stream<String> stream1 = Stream.of("w", "o", "l", "f");
String word = stream1.collect(
String::new,
(left, right) -> {
left.concat(right); // result is ignored
},
String::concat);
С другой стороны, когда вы используете Reduce, вы вынуждены вернуть что-то:
String word = stream1.reduce(
"",
(x, y) -> {
return x.concat(y);
},
(x, y) -> {
return x.concat(y);
});
Конечно, вы все равно можете сделать:
String word = stream1.reduce(
"",
(x, y) -> {
x.concat(y);
return x; // kind of stupid, but you could
},
(x, y) -> {
return x.concat(y);
});
Если вы хотели сломать это; но это не главное.