Freigeben über


MethodHandle.AsCollector Methode

Definition

Überlädt

AsCollector(Class, Int32)

Erstellt einen <Em-Array-Collecting></Em-Methodenhandle>, der eine bestimmte Anzahl von nachfolgenden Positionsargumenten akzeptiert und in einem Arrayargument sammelt.

AsCollector(Int32, Class, Int32)

Erstellt einen <Em-Arraysammlungs><-/Em-Methodenziehpunkt>, der eine bestimmte Anzahl von Positionsargumenten akzeptiert, die an einer bestimmten Position beginnen, und sammelt sie in einem Arrayargument.

AsCollector(Class, Int32)

Erstellt einen <Em-Array-Collecting></Em-Methodenhandle>, der eine bestimmte Anzahl von nachfolgenden Positionsargumenten akzeptiert und in einem Arrayargument sammelt.

[Android.Runtime.Register("asCollector", "(Ljava/lang/Class;I)Ljava/lang/invoke/MethodHandle;", "GetAsCollector_Ljava_lang_Class_IHandler", ApiSince=26)]
public virtual Java.Lang.Invoke.MethodHandle? AsCollector (Java.Lang.Class? arrayType, int arrayLength);
[<Android.Runtime.Register("asCollector", "(Ljava/lang/Class;I)Ljava/lang/invoke/MethodHandle;", "GetAsCollector_Ljava_lang_Class_IHandler", ApiSince=26)>]
abstract member AsCollector : Java.Lang.Class * int -> Java.Lang.Invoke.MethodHandle
override this.AsCollector : Java.Lang.Class * int -> Java.Lang.Invoke.MethodHandle

Parameter

arrayType
Class

häufig Object[], der Typ des Arrayarguments, das die Argumente sammelt

arrayLength
Int32

die Anzahl der Argumente, die in einem neuen Arrayargument gesammelt werden sollen

Gibt zurück

ein neues Methodenhandle, das einige nachfolgende Argumente in einem Array sammelt, bevor der ursprüngliche Methodenhandle aufgerufen wird

Attribute

Hinweise

Erstellt einen <Em-Array-Collecting></Em-Methodenhandle>, der eine bestimmte Anzahl von nachfolgenden Positionsargumenten akzeptiert und in einem Arrayargument sammelt. Das neue Methodenhandle passt sich als Ziel an den aktuellen Methodenhandle an. Der Typ des Adapters entspricht dem Typ des Ziels, mit der Ausnahme, dass ein einzelner nachgestellter Parameter (in der Regel vom Typ arrayType) durch arrayLength Parameter ersetzt wird, deren Typ elementtyp ist arrayType.

Wenn sich der Arraytyp vom endgültigen Argumenttyp des ursprünglichen Ziels unterscheidet, wird das ursprüngliche Ziel so angepasst, dass der Arraytyp direkt verwendet wird, als wäre es durch einen Aufruf von #asType asType.

Wenn der Adapter aufgerufen wird, ersetzt der Adapter seine nachfolgenden arrayLength Argumente durch ein einzelnes neues Array vom Typ arrayType, dessen Elemente (in der Reihenfolge) die ersetzten Argumente umfassen. Schließlich wird das Ziel aufgerufen. Was das Ziel schließlich zurückgibt, wird vom Adapter unverändert zurückgegeben.

(Das Array kann auch eine freigegebene Konstante sein, wenn arrayLength null ist.)

(<em>Hinweis:</em> Dies arrayType ist häufig identisch mit dem letzten Parametertyp des ursprünglichen Ziels. Es handelt sich um ein explizites Argument für die Symmetrie mit asSpreader, und es dem Ziel auch zu ermöglichen, einen einfachen Object als letzten Parametertyp zu verwenden.)

Um einen Sammlungsadapter zu erstellen, der nicht auf eine bestimmte Anzahl gesammelter Argumente beschränkt ist, verwenden Sie #asVarargsCollector asVarargsCollector stattdessen.

Hier sind einige Beispiele für Arraysammlungsmethodenhandles: <Blockquote>

{@code
            MethodHandle deepToString = publicLookup()
              .findStatic(Arrays.class, "deepToString", methodType(String.class, Object[].class));
            assertEquals("[won]",   (String) deepToString.invokeExact(new Object[]{"won"}));
            MethodHandle ts1 = deepToString.asCollector(Object[].class, 1);
            assertEquals(methodType(String.class, Object.class), ts1.type());
            //assertEquals("[won]", (String) ts1.invokeExact(         new Object[]{"won"})); //FAIL
            assertEquals("[[won]]", (String) ts1.invokeExact((Object) new Object[]{"won"}));
            // arrayType can be a subtype of Object[]
            MethodHandle ts2 = deepToString.asCollector(String[].class, 2);
            assertEquals(methodType(String.class, String.class, String.class), ts2.type());
            assertEquals("[two, too]", (String) ts2.invokeExact("two", "too"));
            MethodHandle ts0 = deepToString.asCollector(Object[].class, 0);
            assertEquals("[]", (String) ts0.invokeExact());
            // collectors can be nested, Lisp-style
            MethodHandle ts22 = deepToString.asCollector(Object[].class, 3).asCollector(String[].class, 2);
            assertEquals("[A, B, [C, D]]", ((String) ts22.invokeExact((Object)'A', (Object)"B", "C", "D")));
            // arrayType can be any primitive array type
            MethodHandle bytesToString = publicLookup()
              .findStatic(Arrays.class, "toString", methodType(String.class, byte[].class))
              .asCollector(byte[].class, 3);
            assertEquals("[1, 2, 3]", (String) bytesToString.invokeExact((byte)1, (byte)2, (byte)3));
            MethodHandle longsToString = publicLookup()
              .findStatic(Arrays.class, "toString", methodType(String.class, long[].class))
              .asCollector(long[].class, 1);
            assertEquals("[123]", (String) longsToString.invokeExact((long)123));
            }

</blockquote>

Java-Dokumentation für java.lang.invoke.MethodHandle.asCollector(java.lang.Class<?>, int).

Teile dieser Seite sind Änderungen auf der Grundlage von Arbeiten, die vom Android Open Source-Projekt erstellt und freigegeben werden und gemäß den in der Creative Commons 2.5 Attribution License beschriebenen Begriffen verwendet werden.

Gilt für:

AsCollector(Int32, Class, Int32)

Erstellt einen <Em-Arraysammlungs><-/Em-Methodenziehpunkt>, der eine bestimmte Anzahl von Positionsargumenten akzeptiert, die an einer bestimmten Position beginnen, und sammelt sie in einem Arrayargument.

[Android.Runtime.Register("asCollector", "(ILjava/lang/Class;I)Ljava/lang/invoke/MethodHandle;", "GetAsCollector_ILjava_lang_Class_IHandler", ApiSince=33)]
public virtual Java.Lang.Invoke.MethodHandle? AsCollector (int collectArgPos, Java.Lang.Class? arrayType, int arrayLength);
[<Android.Runtime.Register("asCollector", "(ILjava/lang/Class;I)Ljava/lang/invoke/MethodHandle;", "GetAsCollector_ILjava_lang_Class_IHandler", ApiSince=33)>]
abstract member AsCollector : int * Java.Lang.Class * int -> Java.Lang.Invoke.MethodHandle
override this.AsCollector : int * Java.Lang.Class * int -> Java.Lang.Invoke.MethodHandle

Parameter

collectArgPos
Int32

die nullbasierte Position in der Parameterliste, an der das Sammeln beginnen soll.

arrayType
Class

häufig Object[], der Typ des Arrayarguments, das die Argumente sammelt

arrayLength
Int32

die Anzahl der Argumente, die in einem neuen Arrayargument gesammelt werden sollen

Gibt zurück

ein neues Methodenhandle, das einige Argumente in einem Array sammelt, bevor der ursprüngliche Methodenhandle aufgerufen wird

Attribute

Hinweise

Erstellt einen <Em-Arraysammlungs><-/Em-Methodenziehpunkt>, der eine bestimmte Anzahl von Positionsargumenten akzeptiert, die an einer bestimmten Position beginnen, und sammelt sie in einem Arrayargument. Das neue Methodenhandle passt sich als Ziel an den aktuellen Methodenhandle an. Der Typ des Adapters entspricht dem Typ des Ziels, mit der Ausnahme, dass der Parameter an der position, die durch collectArgPos (in der Regel vom Typ arrayType) angegeben ist, durch arrayLength Parameter ersetzt wird, deren Typ elementtyp ist arrayType.

Diese Methode verhält sich sehr ähnlich #asCollector(Class, int), unterscheidet sich jedoch darin, dass das collectArgPos Argument angibt, an welcher Position in den Parameterlistenargumenten gesammelt werden soll. Dieser Index ist nullbasiert.

Hinzugefügt in 9.

Java-Dokumentation für java.lang.invoke.MethodHandle.asCollector(int, java.lang.Class<?>, int).

Teile dieser Seite sind Änderungen auf der Grundlage von Arbeiten, die vom Android Open Source-Projekt erstellt und freigegeben werden und gemäß den in der Creative Commons 2.5 Attribution License beschriebenen Begriffen verwendet werden.

Gilt für: