From 2642609ccb744002c7af4d838d4e2619d94ab652 Mon Sep 17 00:00:00 2001 From: leeyohan93 Date: Tue, 12 Dec 2023 11:12:35 +0900 Subject: [PATCH] Enhance Kotlin Class Conversion by Minimizing Equals Comparisons. Closes #3000 --- .../data/mapping/model/KotlinInstantiationDelegate.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) 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 c3b1bc09a..d7448f441 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 kotlin.reflect.jvm.ReflectJvmMapping; 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 @@ import org.springframework.lang.Nullable; * 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 @@ class KotlinInstantiationDelegate { 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 @@ class KotlinInstantiationDelegate { 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();