В методе Stream Reduce должны ли тождество всегда быть 0 для суммы и 1 для умножения?

== сравнивает ссылки на объекты в Java и не является исключением для объектов String.

Для сравнения фактического содержимого объектов (в том числе String) необходимо использовать equals.

Если сравнение двух объектов String с использованием == оказывается true, это связано с тем, что объекты String были интернированы, а виртуальная машина Java имеет несколько ссылки указывают на тот же экземпляр String. Не следует ожидать сравнения одного объекта String, содержащего то же содержимое, что и другой объект String, используя == для оценки как true.

13
задан RealSkeptic 30 September 2015 в 13:04
поделиться

1 ответ

У меня есть немного отличающаяся перспектива здесь. Хотя ответ @user43968 дает вероятное выравнивание, почему идентификационные данные необходимы для параллелизма, который действительно необходим? Я верю, не потому что ассоциативности самого бинарного оператора достаточно, чтобы позволить нам параллелизировать уменьшать задание.

, Учитывая выражение A op B op C op D, ассоциативность гарантирует, что ее оценка эквивалентна (A op B) op (C op D), такова, что мы можем оценить sub выражения (A op B) и (C op D) параллельно и объединить результаты позже, не изменяя конечный результат. Например, с операцией сложения, начальное значение = 10, и L = [1, 2, 3], мы хотим вычислить 10 + 1 + 2 + 3 = 16. Мы должны быть хорошо, чтобы вычислить 10 + 1 = 11 и 2 + 3 = 5 параллельно и сделать 11 + 5 = 16 наконец.

единственная причина, почему Java требует, чтобы начальное значение было идентификационными данными, о которых я могу думать, состоит в том, потому что разработчики языка хотели сделать реализацию простой, и все параллелизировали sub симметричные задания. Иначе они должны были дифференцировать первое sub задание, которое принимает начальное значение, как введено по сравнению с другими sub заданиями, которые не делают. Теперь, они просто должны одинаково распределить начальное значение каждому sub заданию, которое является также "уменьшением" его собственным.

Однако это больше об ограничении реализации, которое не должно появиться пользователям языка IMO. Мое инстинктивное чувство говорит мне, что там должен существовать простая реализация, которая не требует, чтобы начальное значение было идентификационными данными.

касательно: http://czheo.github.io/tech/2019/10/24/the-first-argument-of-stream-reduce-does-not-need-to-be-identity-in-java/

0
ответ дан czheo 25 October 2019 в 12:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: