Когда вы присваиваете функцию как значение, созданный объект является экземпляром одного из классов Function (Function1
, если он принимает один аргумент, Function2
, если он принимает два аргумента и т. Д.).На самом деле вызов функции - это всего лишь вопрос вызова метода apply
для объекта FunctionN
.
В этом отношении действительно очень мало накладных расходов, если только вы не смотрите на критический цикл.Теоретически, объект создается для представления функции - объекта без внутреннего состояния и очень маленького класса (содержащего, в большей или меньшей степени, только код для реализации вашей функции).Из-за ограниченного способа использования этого объекта, я ожидаю, что Hotspot сможет применить здесь много оптимизаций.Затем будет отправка дополнительного метода к методу apply
функции по сравнению с оператором match
.Опять же, это фиксированный (и общий) шаблон, так что я ожидаю, что его можно оптимизировать довольно много.
По сути, любые издержки будут незначительными.Как и во всех оптимизациях, было бы преждевременно писать ваш код искусственно сжатым / менее естественным способом, пока вы не определили, что это узкое место в производительности.в конечном итоге вы захотите получить что-то более оптимизированное, чем или .
А пока расслабьтесь и наслаждайтесь "приятностью", которую дают вам первоклассные функции!