MethodHandles.FoldArguments Método
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Sobrecargas
FoldArguments(MethodHandle, Int32, MethodHandle) |
Adapta um identificador de método de destino pré-processando alguns de seus argumentos, começando em uma determinada posição e, em seguida, chamando o destino com o resultado do pré-processamento, inserido na sequência original de argumentos imediatamente antes dos argumentos dobrados. |
FoldArguments(MethodHandle, MethodHandle) |
Adapta um identificador de método de destino pré-processando alguns de seus argumentos e, em seguida, chamando o destino com o resultado do pré-processamento, inserido na sequência original de argumentos. |
FoldArguments(MethodHandle, Int32, MethodHandle)
Adapta um identificador de método de destino pré-processando alguns de seus argumentos, começando em uma determinada posição e, em seguida, chamando o destino com o resultado do pré-processamento, inserido na sequência original de argumentos imediatamente antes dos argumentos dobrados.
[Android.Runtime.Register("foldArguments", "(Ljava/lang/invoke/MethodHandle;ILjava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=33)]
public static Java.Lang.Invoke.MethodHandle? FoldArguments (Java.Lang.Invoke.MethodHandle? target, int pos, Java.Lang.Invoke.MethodHandle? combiner);
[<Android.Runtime.Register("foldArguments", "(Ljava/lang/invoke/MethodHandle;ILjava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=33)>]
static member FoldArguments : Java.Lang.Invoke.MethodHandle * int * Java.Lang.Invoke.MethodHandle -> Java.Lang.Invoke.MethodHandle
Parâmetros
- target
- MethodHandle
O identificador de método para invocar depois que os argumentos são combinados
- pos
- Int32
A posição em que iniciar a dobragem e na qual inserir o resultado da dobragem; se isso for 0
, o efeito é o mesmo que para #foldArguments(MethodHandle, MethodHandle)
.
- combiner
- MethodHandle
identificador de método para chamar inicialmente os argumentos de entrada
Retornos
identificador de método que incorpora a lógica de dobramento de argumento especificada
- Atributos
Comentários
Adapta um identificador de método de destino pré-processando alguns de seus argumentos, começando em uma determinada posição e, em seguida, chamando o destino com o resultado do pré-processamento, inserido na sequência original de argumentos imediatamente antes dos argumentos dobrados.
Este método está intimamente relacionado com #foldArguments(MethodHandle, MethodHandle)
, mas permite controlar a posição na lista de parâmetros em que o dobramento ocorre. O argumento que controla isso, pos
, é um índice baseado em zero. O método #foldArguments(MethodHandle, MethodHandle)
acima mencionado assume a posição 0.
Adicionado em 9.
Partes desta página são modificações baseadas no trabalho criado e compartilhado pelo Android Open Source Project e usado de acordo com os termos descritos na Creative Commons 2.5 Attribution License.
Aplica-se a
FoldArguments(MethodHandle, MethodHandle)
Adapta um identificador de método de destino pré-processando alguns de seus argumentos e, em seguida, chamando o destino com o resultado do pré-processamento, inserido na sequência original de argumentos.
[Android.Runtime.Register("foldArguments", "(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=26)]
public static Java.Lang.Invoke.MethodHandle? FoldArguments (Java.Lang.Invoke.MethodHandle? target, Java.Lang.Invoke.MethodHandle? combiner);
[<Android.Runtime.Register("foldArguments", "(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=26)>]
static member FoldArguments : Java.Lang.Invoke.MethodHandle * Java.Lang.Invoke.MethodHandle -> Java.Lang.Invoke.MethodHandle
Parâmetros
- target
- MethodHandle
O identificador de método para invocar depois que os argumentos são combinados
- combiner
- MethodHandle
identificador de método para chamar inicialmente os argumentos de entrada
Retornos
identificador de método que incorpora a lógica de dobramento de argumento especificada
- Atributos
Comentários
Adapta um identificador de método de destino pré-processando alguns de seus argumentos e, em seguida, chamando o destino com o resultado do pré-processamento, inserido na sequência original de argumentos.
O pré-processamento é realizado pelo combiner
, um segundo identificador de método. Dos argumentos passados para o adaptador, os primeiros N
argumentos são copiados para o combinador, que é então chamado. (Aqui, N
é definido como a contagem de parâmetros do combinador.) Depois disso, o controle passa para o destino, com qualquer resultado do combinador inserido antes dos argumentos de entrada originais N
.
Se o combinador retornar um valor, o primeiro tipo de parâmetro do destino deverá ser idêntico ao tipo de retorno do combinador, e os próximos N
tipos de parâmetro do destino deverão corresponder exatamente aos parâmetros do combinador.
Se o combinador tiver um retorno void, nenhum resultado será inserido, e os primeiros N
tipos de parâmetro do destino devem corresponder exatamente aos parâmetros do combinador.
O adaptador resultante é do mesmo tipo que o destino, exceto que o primeiro tipo de parâmetro é descartado, se corresponder ao resultado do combinador.
(Observe que #dropArguments(MethodHandle,int,List) dropArguments
pode ser usado para remover quaisquer argumentos que o combinador ou o destino não deseja receber. Se alguns dos argumentos de entrada forem destinados apenas ao combinador, considere usar MethodHandle#asCollector asCollector
em vez disso, já que esses argumentos não precisarão estar ativos na pilha na entrada para o destino.)
<b>Exemplo:</b><blockquote>
{@code
import static java.lang.invoke.MethodHandles.*;
import static java.lang.invoke.MethodType.*;
...
MethodHandle trace = publicLookup().findVirtual(java.io.PrintStream.class,
"println", methodType(void.class, String.class))
.bindTo(System.out);
MethodHandle cat = lookup().findVirtual(String.class,
"concat", methodType(String.class, String.class));
assertEquals("boojum", (String) cat.invokeExact("boo", "jum"));
MethodHandle catTrace = foldArguments(cat, trace);
// also prints "boo":
assertEquals("boojum", (String) catTrace.invokeExact("boo", "jum"));
}
</blockquote>
Aqui está o pseudocódigo para o adaptador resultante. No código, T
representa o tipo de resultado do target
adaptador e resultante. V
/v
representam o tipo e o valor do parâmetro e do argumento que precede a posição de target
dobramento; V
combiner
A
/a
denotam os tipos e valores dos N
parâmetros e argumentos na posição de dobramento. B
/b
representam os tipos e valores dos target
parâmetros e argumentos que seguem os parâmetros e argumentos dobrados. <blockquote>
{@code
// there are N arguments in A...
T target(V, A[N]..., B...);
V combiner(A...);
T adapter(A... a, B... b) {
V v = combiner(a...);
return target(v, a..., b...);
}
// and if the combiner has a void return:
T target2(A[N]..., B...);
void combiner2(A...);
T adapter2(A... a, B... b) {
combiner2(a...);
return target2(a..., b...);
}
}
</blockquote>
<em>Nota:</em> O adaptador resultante nunca é um identificador de método de aridade variável MethodHandle#asVarargsCollector, mesmo que o identificador de método de destino original fosse.
Partes desta página são modificações baseadas no trabalho criado e compartilhado pelo Android Open Source Project e usado de acordo com os termos descritos na Creative Commons 2.5 Attribution License.