Lenguaje

MethodHandles.CollectArguments(MethodHandle, Int32, MethodHandle) Método

Definición

Adapta un identificador de método de destino mediante el procesamiento previo de una sub-secuencia de sus argumentos con un filtro (otro identificador de método).

[Android.Runtime.Register("collectArguments", "(Ljava/lang/invoke/MethodHandle;ILjava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=26)]
public static Java.Lang.Invoke.MethodHandle? CollectArguments(Java.Lang.Invoke.MethodHandle? target, int pos, Java.Lang.Invoke.MethodHandle? filter);
[<Android.Runtime.Register("collectArguments", "(Ljava/lang/invoke/MethodHandle;ILjava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=26)>]
static member CollectArguments : Java.Lang.Invoke.MethodHandle * int * Java.Lang.Invoke.MethodHandle -> Java.Lang.Invoke.MethodHandle

Parámetros

target
MethodHandle

identificador del método que se va a invocar después de filtrar la subsecuencia de argumentos

pos
Int32

la posición del primer argumento del adaptador que se va a pasar al filtro o al argumento de destino que recibe el resultado del filtro.

filter
MethodHandle

identificador de método para llamar a en la subsecuencia de argumentos

Devoluciones

identificador de método que incorpora la lógica de filtrado de subsecuencia de argumento especificada

Atributos

Comentarios

Adapta un identificador de método de destino mediante el procesamiento previo de una sub-secuencia de sus argumentos con un filtro (otro identificador de método). Los argumentos procesados previamente se reemplazan por el resultado (si existe) de la función de filtro. A continuación, se llama al destino en la lista de argumentos modificados (normalmente abreviados).

Si el filtro devuelve un valor, el destino debe aceptar ese valor como su argumento en la posición pos, precedido o seguido de cualquier argumento que no se pase al filtro. Si el filtro devuelve void, el destino debe aceptar todos los argumentos no pasados al filtro. No se reordenan argumentos y un resultado devuelto por el filtro reemplaza (en orden) la subsecuencia completa de argumentos pasados originalmente al adaptador.

Los tipos de argumento (si los hay) del filtro reemplazan cero o uno de los tipos de argumento del destino, en la posición pos, en el identificador del método adaptado resultante. El tipo de valor devuelto del filtro (si existe) debe ser idéntico al tipo de argumento del destino en la posición posy ese argumento de destino lo proporciona el valor devuelto del filtro.

En todos los casos, pos debe ser mayor o igual que cero y pos también debe ser menor o igual que la aridad del destino.

<b>Ejemplo:</b><blockquote>

{@code
            import static java.lang.invoke.MethodHandles.*;
            import static java.lang.invoke.MethodType.*;
            ...
            MethodHandle deepToString = publicLookup()
              .findStatic(Arrays.class, "deepToString", methodType(String.class, Object[].class));

            MethodHandle ts1 = deepToString.asCollector(String[].class, 1);
            assertEquals("[strange]", (String) ts1.invokeExact("strange"));

            MethodHandle ts2 = deepToString.asCollector(String[].class, 2);
            assertEquals("[up, down]", (String) ts2.invokeExact("up", "down"));

            MethodHandle ts3 = deepToString.asCollector(String[].class, 3);
            MethodHandle ts3_ts2 = collectArguments(ts3, 1, ts2);
            assertEquals("[top, [up, down], strange]",
                         (String) ts3_ts2.invokeExact("top", "up", "down", "strange"));

            MethodHandle ts3_ts2_ts1 = collectArguments(ts3_ts2, 3, ts1);
            assertEquals("[top, [up, down], [strange]]",
                         (String) ts3_ts2_ts1.invokeExact("top", "up", "down", "strange"));

            MethodHandle ts3_ts2_ts3 = collectArguments(ts3_ts2, 1, ts3);
            assertEquals("[top, [[up, down, strange], charm], bottom]",
                         (String) ts3_ts2_ts3.invokeExact("top", "up", "down", "strange", "charm", "bottom"));
            }

</blockquote>

Este es el pseudocódigo para el adaptador resultante: <blockquote>

{@code
            T target(A...,V,C...);
            V filter(B...);
            T adapter(A... a,B... b,C... c) {
              V v = filter(b...);
              return target(a...,v,c...);
            }
            // and if the filter has no arguments:
            T target2(A...,V,C...);
            V filter2();
            T adapter2(A... a,C... c) {
              V v = filter2();
              return target2(a...,v,c...);
            }
            // and if the filter has a void return:
            T target3(A...,C...);
            void filter3(B...);
            void adapter3(A... a,B... b,C... c) {
              filter3(b...);
              return target3(a...,c...);
            }
            }

</blockquote>

Un adaptador collectArguments(mh, 0, coll) de colección es equivalente a uno que primero "plega" los argumentos afectados y, a continuación, los quita, en pasos independientes como se indica a continuación: <blockquote>

{@code
            mh = MethodHandles.dropArguments(mh, 1, coll.type().parameterList()); //step 2
            mh = MethodHandles.foldArguments(mh, coll); //step 1
            }

</blockquote> Si el identificador del método de destino no consume ningún argumento además del resultado (si existe) del filtro coll, collectArguments(mh, 0, coll) es equivalente a filterReturnValue(coll, mh). Si el identificador coll del método de filtro consume un argumento y genera un resultado no nulo, collectArguments(mh, N, coll) es equivalente a filterArguments(mh, N, coll). Otras equivalencias son posibles, pero requerirían permutación de argumentos.

Java documentación para java.lang.invoke.MethodHandles.collectArguments(java.lang.invoke.MethodHandle, int, java.lang.invoke.MethodHandle).

Las partes de esta página son modificaciones basadas en el trabajo creado y compartido por el Android y se usan según los términos descritos en creative Creative Commons 2.5 Attribution License.

Se aplica a