From d6cf4d70e92b1eb7f286e188066cbfe0b1fbe103 Mon Sep 17 00:00:00 2001 From: wy Date: Sat, 17 Dec 2022 08:41:27 +0800 Subject: [PATCH] =?UTF-8?q?style(core):=20=E8=A7=84=E8=8C=83=E5=91=BD?= =?UTF-8?q?=E5=90=8D=EF=BC=8C=E6=9A=B4=E9=9C=B2=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hutool/core/lang/func/LambdaFactory.java | 49 +++++++++---------- .../cn/hutool/core/lang/func/LambdaUtil.java | 20 ++++---- .../core/lang/func/LambdaFactoryTest.java | 25 +++++----- .../hutool/core/lang/func/LambdaUtilTest.java | 14 +++--- 4 files changed, 55 insertions(+), 53 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaFactory.java b/hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaFactory.java index aeb2df1c5..d3b97c2b1 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaFactory.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaFactory.java @@ -1,5 +1,6 @@ package cn.hutool.core.lang.func; +import cn.hutool.core.exceptions.UtilException; import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Opt; import cn.hutool.core.lang.mutable.MutableEntry; @@ -51,8 +52,8 @@ public class LambdaFactory { * @param paramTypes 方法参数数组 * @return 接受Lambda的函数式接口对象 */ - public static F buildLambda(Class functionInterfaceType, Class methodClass, String methodName, Class... paramTypes) { - return buildLambda(functionInterfaceType, MethodUtil.getMethod(methodClass, methodName, paramTypes)); + public static F build(Class functionInterfaceType, Class methodClass, String methodName, Class... paramTypes) { + return build(functionInterfaceType, MethodUtil.getMethod(methodClass, methodName, paramTypes)); } /** @@ -62,7 +63,7 @@ public class LambdaFactory { * @param method 方法对象 * @return 接受Lambda的函数式接口对象 */ - public static F buildLambda(Class functionInterfaceType, Method method) { + public static F build(Class functionInterfaceType, Method method) { Assert.notNull(functionInterfaceType); Assert.notNull(method); MutableEntry, Method> cacheKey = new MutableEntry<>(functionInterfaceType, method); @@ -82,31 +83,29 @@ public class LambdaFactory { MethodType samMethodType = methodType(invokeMethod.getReturnType(), invokeMethod.getParameterTypes()); MethodHandle implMethod = Opt.ofTry(() -> caller.unreflect(method)).get(); MethodType insMethodType = methodType(method.getReturnType(), method.getDeclaringClass(), method.getParameterTypes()); - boolean isSerializable = Arrays.stream(functionInterfaceType.getInterfaces()).anyMatch(i -> i.isAssignableFrom(Serializable.class)); - CallSite callSite = Opt.ofTry(() -> isSerializable ? - LambdaMetafactory.altMetafactory( - caller, - invokeName, - invokedType, - samMethodType, - implMethod, - insMethodType, - FLAG_SERIALIZABLE - ) : - LambdaMetafactory.metafactory( - caller, - invokeName, - invokedType, - samMethodType, - implMethod, - insMethodType - )).get(); - + boolean isSerializable = Serializable.class.isAssignableFrom(functionInterfaceType); try { - //noinspection unchecked + CallSite callSite = isSerializable ? + LambdaMetafactory.altMetafactory( + caller, + invokeName, + invokedType, + samMethodType, + implMethod, + insMethodType, + FLAG_SERIALIZABLE + ) : + LambdaMetafactory.metafactory( + caller, + invokeName, + invokedType, + samMethodType, + implMethod, + insMethodType + ); return (F) callSite.getTarget().invoke(); } catch (Throwable e) { - throw new RuntimeException(e); + throw new UtilException(e); } }); diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaUtil.java b/hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaUtil.java index b57824ac4..15f942687 100755 --- a/hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaUtil.java @@ -140,8 +140,8 @@ public class LambdaUtil { * @param getter方法返回值类型 * @return Obj::getXxx */ - public static Function getter(Method getMethod) { - return LambdaFactory.buildLambda(Function.class, getMethod); + public static Function buildGetter(Method getMethod) { + return LambdaFactory.build(Function.class, getMethod); } /** @@ -153,8 +153,8 @@ public class LambdaUtil { * @param getter方法返回值类型 * @return Obj::getXxx */ - public static Function getter(Class clazz, String fieldName) { - return LambdaFactory.buildLambda(Function.class, BeanUtil.getBeanDesc(clazz).getGetter(fieldName)); + public static Function buildGetter(Class clazz, String fieldName) { + return LambdaFactory.build(Function.class, BeanUtil.getBeanDesc(clazz).getGetter(fieldName)); } /** @@ -165,8 +165,8 @@ public class LambdaUtil { * @param

setter方法返回的值类型 * @return Obj::setXxx */ - public static BiConsumer setter(Method setMethod) { - return LambdaFactory.buildLambda(BiConsumer.class, setMethod); + public static BiConsumer buildSetter(Method setMethod) { + return LambdaFactory.build(BiConsumer.class, setMethod); } /** @@ -178,8 +178,8 @@ public class LambdaUtil { * @param

setter方法返回的值类型 * @return Obj::setXxx */ - public static BiConsumer setter(Class clazz, String fieldName) { - return LambdaFactory.buildLambda(BiConsumer.class, BeanUtil.getBeanDesc(clazz).getSetter(fieldName)); + public static BiConsumer buildSetter(Class clazz, String fieldName) { + return LambdaFactory.build(BiConsumer.class, BeanUtil.getBeanDesc(clazz).getSetter(fieldName)); } /** @@ -192,8 +192,8 @@ public class LambdaUtil { * @param 函数式接口类型 * @return Obj::method */ - public static F lambda(Class lambdaType, Class clazz, String methodName, Class... paramsTypes) { - return LambdaFactory.buildLambda(lambdaType, clazz, methodName, paramsTypes); + public static F build(Class lambdaType, Class clazz, String methodName, Class... paramsTypes) { + return LambdaFactory.build(lambdaType, clazz, methodName, paramsTypes); } //region Private methods diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/func/LambdaFactoryTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/func/LambdaFactoryTest.java index 5c8e99171..a07ddbd19 100644 --- a/hutool-core/src/test/java/cn/hutool/core/lang/func/LambdaFactoryTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/lang/func/LambdaFactoryTest.java @@ -1,6 +1,7 @@ package cn.hutool.core.lang.func; import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.exceptions.UtilException; import cn.hutool.core.reflect.MethodHandleUtil; import lombok.Data; import lombok.Getter; @@ -11,10 +12,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandleProxies; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; +import java.lang.invoke.*; import java.lang.reflect.Method; import java.util.Arrays; import java.util.Collection; @@ -28,9 +26,14 @@ import java.util.function.Function; */ public class LambdaFactoryTest { - @Test(expected = RuntimeException.class) + // @Test + @Test public void testMethodNotMatch() { - LambdaFactory.buildLambda(Function.class, Something.class, "setId", Long.class); + try { + LambdaFactory.build(Function.class, Something.class, "setId", Long.class); + } catch (Exception e) { + Assert.assertTrue(e.getCause() instanceof LambdaConversionException); + } } @Test @@ -39,14 +42,14 @@ public class LambdaFactoryTest { something.setId(1L); something.setName("name"); - Function get11 = LambdaFactory.buildLambda(Function.class, Something.class, "getId"); - Function get12 = LambdaFactory.buildLambda(Function.class, Something.class, "getId"); + Function get11 = LambdaFactory.build(Function.class, Something.class, "getId"); + Function get12 = LambdaFactory.build(Function.class, Something.class, "getId"); Assert.assertEquals(get11, get12); Assert.assertEquals(something.getId(), get11.apply(something)); String name = "sname"; - BiConsumer set = LambdaFactory.buildLambda(BiConsumer.class, Something.class, "setName", String.class); + BiConsumer set = LambdaFactory.build(BiConsumer.class, Something.class, "setName", String.class); set.accept(something, name); Assert.assertEquals(something.getName(), name); @@ -139,7 +142,7 @@ public class LambdaFactoryTest { Method getByReflect = Something.class.getMethod("getId"); MethodHandle getByMh = MethodHandleUtil.findMethod(Something.class, "getId", MethodType.methodType(Long.class)); Function getByProxy = MethodHandleProxies.asInterfaceInstance(Function.class, MethodHandles.lookup().unreflect(getByReflect)); - Function getByLambda = LambdaFactory.buildLambda(Function.class, getByReflect); + Function getByLambda = LambdaFactory.build(Function.class, getByReflect); Task lambdaTask = new Task("lambda", () -> getByLambda.apply(something)); Task mhTask = new Task("mh", () -> getByMh.invoke(something)); Task proxyTask = new Task("proxy", () -> getByProxy.apply(something)); @@ -214,7 +217,7 @@ public class LambdaFactoryTest { Method setByReflect = Something.class.getMethod("setName", String.class); MethodHandle setByMh = MethodHandleUtil.findMethod(Something.class, "setName", MethodType.methodType(Void.TYPE, String.class)); BiConsumer setByProxy = MethodHandleProxies.asInterfaceInstance(BiConsumer.class, setByMh); - BiConsumer setByLambda = LambdaFactory.buildLambda(BiConsumer.class, setByReflect); + BiConsumer setByLambda = LambdaFactory.build(BiConsumer.class, setByReflect); String name = "name1"; Task lambdaTask = new Task("lambda", () -> { setByLambda.accept(something, name); diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/func/LambdaUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/func/LambdaUtilTest.java index 08d0c144d..d410b92fc 100644 --- a/hutool-core/src/test/java/cn/hutool/core/lang/func/LambdaUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/lang/func/LambdaUtilTest.java @@ -155,8 +155,8 @@ public class LambdaUtilTest { Bean bean = new Bean(); bean.setId(2L); - Function getId = cn.hutool.core.lang.func.LambdaUtil.getter(MethodUtil.getMethod(Bean.class, "getId")); - Function getId2 = cn.hutool.core.lang.func.LambdaUtil.getter(Bean.class, Bean.Fields.id); + Function getId = LambdaUtil.buildGetter(MethodUtil.getMethod(Bean.class, "getId")); + Function getId2 = LambdaUtil.buildGetter(Bean.class, Bean.Fields.id); Assert.assertEquals(getId, getId2); Assert.assertEquals(bean.getId(), getId.apply(bean)); @@ -168,9 +168,9 @@ public class LambdaUtilTest { bean.setId(2L); bean.setFlag(false); - BiConsumer setId = cn.hutool.core.lang.func.LambdaUtil.setter(MethodUtil.getMethod(Bean.class, "setId", Long.class)); - BiConsumer setId2 = cn.hutool.core.lang.func.LambdaUtil.setter(Bean.class, Bean.Fields.id); - BiConsumer setFlag = cn.hutool.core.lang.func.LambdaUtil.setter(Bean.class, Bean.Fields.flag); + BiConsumer setId = LambdaUtil.buildSetter(MethodUtil.getMethod(Bean.class, "setId", Long.class)); + BiConsumer setId2 = LambdaUtil.buildSetter(Bean.class, Bean.Fields.id); + BiConsumer setFlag = LambdaUtil.buildSetter(Bean.class, Bean.Fields.flag); Assert.assertEquals(setId, setId2); setId.accept(bean, 3L); @@ -185,8 +185,8 @@ public class LambdaUtilTest { bean.setId(1L); bean.setPid(0L); bean.setFlag(true); - BiFunction uniqueKeyFunction = LambdaUtil.lambda(BiFunction.class, Bean.class, "uniqueKey", String.class); - Function4 paramsFunction = LambdaUtil.lambda(Function4.class, Bean.class, "params", String.class, Integer.class, Double.class); + BiFunction uniqueKeyFunction = LambdaUtil.build(BiFunction.class, Bean.class, "uniqueKey", String.class); + Function4 paramsFunction = LambdaUtil.build(Function4.class, Bean.class, "params", String.class, Integer.class, Double.class); Assert.assertEquals(bean.uniqueKey("test"), uniqueKeyFunction.apply(bean, "test")); Assert.assertEquals(bean.params("test", 1, 0.5), paramsFunction.apply(bean, "test", 1, 0.5)); }