MethodHandles.CollectArguments(MethodHandle, Int32, MethodHandle) 메서드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
필터(다른 메서드 핸들)를 사용하여 인수의 하위 시퀀스를 미리 처리하여 대상 메서드 핸들을 조정합니다.
[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
매개 변수
- target
- MethodHandle
인수의 하위 시퀀스를 필터링한 후 호출할 메서드 핸들
- pos
- Int32
필터에 전달할 첫 번째 어댑터 인수의 위치 및/또는 필터의 결과를 받는 대상 인수
- filter
- MethodHandle
인수의 하위 시퀀스를 호출하는 메서드 핸들
반품
지정된 인수 하위 시퀀스 필터링 논리를 통합하는 메서드 핸들
- 특성
설명
필터(다른 메서드 핸들)를 사용하여 인수의 하위 시퀀스를 미리 처리하여 대상 메서드 핸들을 조정합니다. 미리 처리된 인수는 필터 함수의 결과(있는 경우)로 바뀝니다. 그런 다음 수정된(일반적으로 단축된) 인수 목록에서 대상이 호출됩니다.
필터가 값을 반환하는 경우 대상은 해당 값을 필터에 전달되지 않은 인수 앞이나 뒤에 오는 위치에 pos있는 인수로 수락해야 합니다. 필터가 void를 반환하는 경우 대상은 필터에 전달되지 않은 모든 인수를 수락해야 합니다. 인수는 다시 정렬되지 않으며 필터에서 반환된 결과는 원래 어댑터에 전달된 인수의 전체 하위 시퀀스를 순서대로 바꿉니다.
필터의 인수 형식(있는 경우)은 결과 조정된 메서드 핸들에서 대상의 인수 형식 0개 또는 1개를 위치 pos로 바꿉니다. 필터의 반환 형식(있는 경우)은 위치에 pos있는 대상의 인수 형식과 동일해야 하며 해당 대상 인수는 필터의 반환 값에 의해 제공됩니다.
모든 경우에 pos 0보다 크거나 같아야 하며 pos 대상의 진부도보다 작거나 같아야 합니다.
<b>예제:</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>
결과 어댑터 <에 대한 의사 코드는 다음과 같습니다. 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>
컬렉션 어댑터는 영향을 받는 인수를 먼저 "접은" 다음 블록 인용과 같이 <별도의 단계로 삭제하는 어댑터 collectArguments(mh, 0, coll) 와 같습니다.>
{@code
mh = MethodHandles.dropArguments(mh, 1, coll.type().parameterList()); //step 2
mh = MethodHandles.foldArguments(mh, coll); //step 1
}
</blockquote> 대상 메서드 핸들이 필터 collcollectArguments(mh, 0, coll) 의 결과(있는 경우) 외에 인수를 사용하지 않는 경우와 동일합니다filterReturnValue(coll, mh). 필터 메서드 핸들 coll 이 하나의 인수를 사용하고 void가 아닌 결과를 collectArguments(mh, N, coll) 생성하는 경우와 같습니다 filterArguments(mh, N, coll). 다른 동등성은 가능하지만 인수 순열이 필요합니다.
이 페이지의 일부는 만들고 공유한 작업을 기반으로 하며 에 설명된 조건에 따라 사용됩니다.