Какая связь между MethodHandles.foldArguments и MethodHandle.asCollector?
Javadoc для MethodHandles.foldArguments содержит это примечание в скобках:
(Обратите внимание, что dropArguments можно использовать для удаления любых аргументов, которые комбинатор или цель не желают получать. Если некоторые из входящих аргументов предназначены только для комбинера, рассмотрите возможность использования asCollector, поскольку эти аргументы не нужно будет использовать. жить в стеке при входе в цель.)
Во-первых, я не совсем понимаю, предлагает ли это заменить foldArguments на dropArguments + asCollector, заменить foldArguments + dropArguments на asCollector, заменить foldArguments + dropArguments на foldArguments + asCollector и т. Д.
Во-вторых, я не понимаю, почему MethodHandles.asCollector здесь вообще актуален.
В заметке не написано "Если вы просто хотите собрать аргументы в массив, используйте asCollector", это означает, что asCollector является общей заменой для foldArguments (возможно, в некоторой комбинации с dropArguments), а это не так.
Кажется, что бит "жить в стеке при входе в цель" должен сначала собрать все аргументы, "предназначенные только для объединителя", в массив с asCollector, прежде чем отправлять их объединителю. Я не понимаю, как добавление создания массива и дополнительный уровень косвенности может помочь чему-либо, особенно потому, что если дескриптор получающегося метода будет встроен, JVM все равно попытается оптимизировать создание массива. Если аргументы только для комбинатора отбрасываются с помощью dropArguments, JVM должна быть в состоянии доказать, что они не используются в цели. Если по какой-то причине JVM не может доказать, что аргументы только для комбинатора не используются в цели, и, следовательно, должны поддерживать их работу, то, безусловно, массив, созданный asCollector, будет живым и, таким образом, будет также поддерживать свое содержимое. Они будут в куче, а не в стеке, но я не понимаю, как это поможет (особенно если они ссылаются на объекты, уже находящиеся в куче).
В Java 8 добавлен MethodHandles.collectArguments, который объединяет foldArguments и dropArguments очевидным способом реализации аргументов только для сборщика. Javadoc collectArguments не упоминает asCollector в качестве альтернативы, предлагая какой-либо совет использовать вместо этого asCollector, но Javadoc foldArguments по-прежнему содержит запутанную заметку в скобках.
Какая связь (если есть) между MethodHandles.foldArguments и MethodHandle.asCollector?