diff --git a/src/main/java/org/springframework/data/mapping/model/KotlinInstantiationDelegate.java b/src/main/java/org/springframework/data/mapping/model/KotlinInstantiationDelegate.java index c3b1bc09ac..d7448f441c 100644 --- a/src/main/java/org/springframework/data/mapping/model/KotlinInstantiationDelegate.java +++ b/src/main/java/org/springframework/data/mapping/model/KotlinInstantiationDelegate.java @@ -22,7 +22,9 @@ import java.lang.reflect.Constructor; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.function.Function; +import java.util.stream.Collectors; import java.util.stream.IntStream; import org.springframework.data.mapping.InstanceCreatorMetadata; @@ -40,12 +42,14 @@ * constructor argument extraction. * * @author Mark Paluch + * @author Yohan Lee * @since 3.1 */ class KotlinInstantiationDelegate { private final KFunction constructor; private final List kParameters; + private final Map indexByKParameter; private final List> wrappers = new ArrayList<>(); private final Constructor constructorToInvoke; private final boolean hasDefaultConstructorMarker; @@ -62,6 +66,8 @@ public KotlinInstantiationDelegate(PreferredConstructor preferredConstruct this.constructor = kotlinConstructor; this.kParameters = kotlinConstructor.getParameters(); + this.indexByKParameter = IntStream.range(0, kParameters.size()).boxed() + .collect(Collectors.toMap(kParameters::get, Function.identity())); this.constructorToInvoke = constructorToInvoke; this.hasDefaultConstructorMarker = hasDefaultConstructorMarker(constructorToInvoke.getParameters()); @@ -118,7 +124,7 @@ public

> Object[] extractInvocationArguments(Obj KotlinDefaultMask defaultMask = KotlinDefaultMask.forConstructor(constructor, it -> { - int index = kParameters.indexOf(it); + int index = indexByKParameter.get(it); Parameter parameter = parameters.get(index); Class type = parameter.getType().getType();