From 7ac9fdd8e341207dc81c25aaec3ac9ccf81eef99 Mon Sep 17 00:00:00 2001 From: wangyu <727842003@qq.com> Date: Tue, 16 Jul 2024 16:17:14 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E9=93=BE=E5=BC=8F?= =?UTF-8?q?=E8=B0=83=E7=94=A8=EF=BC=8C=E6=94=AF=E6=8C=81reduce=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E5=92=8C=E5=AD=98=E5=9C=A8=E6=80=A7=E5=88=A4=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../meta/parser/BeanPropertyAnnotations.java | 25 +++++++++++ .../parser/SimpleBeanPropertyAnnotations.java | 42 ++++++++++++++++++- .../parser/chain/AnnotationChainSupport.java | 13 +++++- .../BeanPropertyAnnotationBatchChain.java | 11 ++++- .../chain/BeanPropertyAnnotationChain.java | 6 +++ .../impl/BasicAnnotationChainSupport.java | 19 ++++++--- .../chain/impl/EmptyAnnotationBatchChain.java | 32 ++++++++++++++ .../chain/impl/EmptyAnnotationChain.java | 31 ++++++++++++++ .../impl/SimpleAnnotationBatchChain.java | 33 +++++++++++++++ .../chain/impl/SimpleAnnotationChain.java | 30 +++++++++++++ 10 files changed, 232 insertions(+), 10 deletions(-) diff --git a/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/BeanPropertyAnnotations.java b/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/BeanPropertyAnnotations.java index a09562d..5500416 100644 --- a/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/BeanPropertyAnnotations.java +++ b/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/BeanPropertyAnnotations.java @@ -53,6 +53,15 @@ public interface BeanPropertyAnnotations { */ BeanPropertyAnnotationChain> as(Class annotationType); + /** + * 判断某个注解是否存在,存在则交给consumer进行处理,仅取得找到的第一个注解 + * + * @param annotationType 注解类型 + * @param 泛型 + * @return 结果 + */ + BeanPropertyAnnotationChain> as(String annotationType); + /** * 判断某个注解是否存在,存在则交给consumer进行处理,取得所有注解并自动判断复数形式 * @@ -80,6 +89,22 @@ public interface BeanPropertyAnnotations { */ boolean last(); + /** + * 设置缓存的值 + * + * @param value 值 + * @param 值泛型 + */ + BeanPropertyAnnotations value(T value); + + /** + * 返回上一步的值 + * + * @param 泛型 + * @return 结果 + */ + T value(); + /** * 返回空的运行链 * diff --git a/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/SimpleBeanPropertyAnnotations.java b/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/SimpleBeanPropertyAnnotations.java index 2e61374..f1ede48 100644 --- a/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/SimpleBeanPropertyAnnotations.java +++ b/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/SimpleBeanPropertyAnnotations.java @@ -31,6 +31,7 @@ public class SimpleBeanPropertyAnnotations implements BeanPropertyAnnotations { private final EmptyAnnotationChain emptyChain = new EmptyAnnotationChain<>(this); private final EmptyAnnotationBatchChain emptyBatchChain = new EmptyAnnotationBatchChain<>(this); private boolean last; + private Object value; SimpleBeanPropertyAnnotations(AnnotatedElement field) { this.field = field; @@ -68,6 +69,7 @@ public class SimpleBeanPropertyAnnotations implements BeanPropertyAnnotations { * @return 结果 */ @Override + @SuppressWarnings("Duplicates") public BeanPropertyAnnotationChain> as(Class annotationType) { if (null != field && !this.last) { MergedAnnotation annotation = this.annotations.get(annotationType); @@ -78,6 +80,24 @@ public class SimpleBeanPropertyAnnotations implements BeanPropertyAnnotations { return empty(); } + /** + * 判断某个注解是否存在,存在则交给consumer进行处理,仅取得找到的第一个注解 + * + * @param annotationType 注解类型 + * @return 结果 + */ + @Override + @SuppressWarnings("Duplicates") + public BeanPropertyAnnotationChain> as(String annotationType) { + if (null != field && !this.last) { + MergedAnnotation annotation = this.annotations.get(annotationType); + if (annotation.isPresent()) { + return new SimpleAnnotationChain<>(this.last(true), annotation); + } + } + return empty(); + } + /** * 判断某个注解是否存在,存在则交给consumer进行处理,取得所有注解并自动判断复数形式 * @@ -129,6 +149,27 @@ public class SimpleBeanPropertyAnnotations implements BeanPropertyAnnotations { return this.last; } + /** + * 设置缓存的值 + * + * @param value 值 + */ + @Override + public BeanPropertyAnnotations value(T value) { + this.value = value; + return this; + } + + /** + * 返回上一步的值 + * + * @return 结果 + */ + @Override + public T value() { + return cast(value); + } + /** * 返回空的运行链 * @@ -145,7 +186,6 @@ public class SimpleBeanPropertyAnnotations implements BeanPropertyAnnotations { * @return 结果 */ @Override - public BeanPropertyAnnotationBatchChain batchEmpty() { return cast(emptyBatchChain); } diff --git a/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/chain/AnnotationChainSupport.java b/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/chain/AnnotationChainSupport.java index 183fcad..f5fa500 100644 --- a/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/chain/AnnotationChainSupport.java +++ b/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/chain/AnnotationChainSupport.java @@ -24,7 +24,16 @@ public interface AnnotationChainSupport { BeanPropertyAnnotations or(); /** - * 主动停止操作,会清空前面的状态 + * 当前值是否存在 + * + * @return 结果 */ - void end(); + boolean isPresent(); + + /** + * 主动停止操作,会清空前面的状态 + * + * @return 结束状态,true则是以值结束,false以空结束 + */ + boolean end(); } diff --git a/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/chain/BeanPropertyAnnotationBatchChain.java b/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/chain/BeanPropertyAnnotationBatchChain.java index c725192..4984967 100644 --- a/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/chain/BeanPropertyAnnotationBatchChain.java +++ b/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/chain/BeanPropertyAnnotationBatchChain.java @@ -64,12 +64,19 @@ public interface BeanPropertyAnnotationBatchChain exten */ BeanPropertyAnnotationBatchChain empty(Runnable fallback); + /** + * 将多值合并为单值 + * + * @param reducer 合并器 + * @param 返回泛型 + * @return 结果 + */ + BeanPropertyAnnotationChain reduce(Function, R> reducer); + /** * 获取所有结果为list * * @return 结果 */ List synthesize(); - - } diff --git a/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/chain/BeanPropertyAnnotationChain.java b/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/chain/BeanPropertyAnnotationChain.java index 088a613..afb4b5b 100644 --- a/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/chain/BeanPropertyAnnotationChain.java +++ b/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/chain/BeanPropertyAnnotationChain.java @@ -70,4 +70,10 @@ public interface BeanPropertyAnnotationChain extends An */ A synthesize(); + /** + * 获取缓存的值 + * + * @return 结果 + */ + T get(); } diff --git a/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/chain/impl/BasicAnnotationChainSupport.java b/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/chain/impl/BasicAnnotationChainSupport.java index cbf0fe9..398c4d0 100644 --- a/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/chain/impl/BasicAnnotationChainSupport.java +++ b/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/chain/impl/BasicAnnotationChainSupport.java @@ -10,7 +10,7 @@ import lombok.RequiredArgsConstructor; * @author wangyu */ @RequiredArgsConstructor -public class BasicAnnotationChainSupport implements AnnotationChainSupport { +abstract class BasicAnnotationChainSupport implements AnnotationChainSupport { // 父级 protected final BeanPropertyAnnotations parent; @@ -22,7 +22,7 @@ public class BasicAnnotationChainSupport implements AnnotationChainSupport { */ @Override public BeanPropertyAnnotations and() { - return parent.last(false); + return cache().last(false); } /** @@ -32,14 +32,23 @@ public class BasicAnnotationChainSupport implements AnnotationChainSupport { */ @Override public BeanPropertyAnnotations or() { - return parent; + return cache(); } /** * 主动停止操作,会清空前面的状态 */ @Override - public void end() { - parent.last(false); + public boolean end() { + boolean result = isPresent(); + parent.last(false).value(null); + return result; } + + /** + * 缓存值逻辑 + * + * @return 父亲 + */ + protected abstract BeanPropertyAnnotations cache(); } diff --git a/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/chain/impl/EmptyAnnotationBatchChain.java b/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/chain/impl/EmptyAnnotationBatchChain.java index 2b7c26a..0787bad 100644 --- a/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/chain/impl/EmptyAnnotationBatchChain.java +++ b/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/chain/impl/EmptyAnnotationBatchChain.java @@ -2,6 +2,7 @@ package dev.flyfish.framework.beans.meta.parser.chain.impl; import dev.flyfish.framework.beans.meta.parser.BeanPropertyAnnotations; import dev.flyfish.framework.beans.meta.parser.chain.BeanPropertyAnnotationBatchChain; +import dev.flyfish.framework.beans.meta.parser.chain.BeanPropertyAnnotationChain; import java.lang.annotation.Annotation; import java.util.Collections; @@ -94,6 +95,27 @@ public class EmptyAnnotationBatchChain extends BasicAnn return this; } + /** + * 将多值合并为单值 + * + * @param reducer 合并器 + * @return 结果 + */ + @Override + public BeanPropertyAnnotationChain reduce(Function, R> reducer) { + return parent.empty(); + } + + /** + * 是否存在值 + * + * @return 结果 + */ + @Override + public boolean isPresent() { + return false; + } + /** * 获取所有结果为list * @@ -104,4 +126,14 @@ public class EmptyAnnotationBatchChain extends BasicAnn parent.last(false); return Collections.emptyList(); } + + /** + * 缓存值逻辑 + * + * @return 父亲 + */ + @Override + protected BeanPropertyAnnotations cache() { + return parent; + } } diff --git a/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/chain/impl/EmptyAnnotationChain.java b/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/chain/impl/EmptyAnnotationChain.java index 345cd54..abf3d45 100644 --- a/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/chain/impl/EmptyAnnotationChain.java +++ b/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/chain/impl/EmptyAnnotationChain.java @@ -93,6 +93,16 @@ public class EmptyAnnotationChain extends BasicAnnotati return this; } + /** + * 当前值是否存在 + * + * @return 结果 + */ + @Override + public boolean isPresent() { + return false; + } + /** * 直接获取结果 * @@ -102,4 +112,25 @@ public class EmptyAnnotationChain extends BasicAnnotati public A synthesize() { return null; } + + /** + * 获取当前数据 + * + * @return 结果 + */ + @Override + public T get() { + // 从空的占位访问,访问上次的结果 + return parent.value(); + } + + /** + * 缓存值逻辑 + * + * @return 父亲 + */ + @Override + protected BeanPropertyAnnotations cache() { + return parent; + } } diff --git a/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/chain/impl/SimpleAnnotationBatchChain.java b/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/chain/impl/SimpleAnnotationBatchChain.java index 3c89943..540ba12 100644 --- a/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/chain/impl/SimpleAnnotationBatchChain.java +++ b/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/chain/impl/SimpleAnnotationBatchChain.java @@ -2,6 +2,7 @@ package dev.flyfish.framework.beans.meta.parser.chain.impl; import dev.flyfish.framework.beans.meta.parser.BeanPropertyAnnotations; import dev.flyfish.framework.beans.meta.parser.chain.BeanPropertyAnnotationBatchChain; +import dev.flyfish.framework.beans.meta.parser.chain.BeanPropertyAnnotationChain; import org.springframework.core.annotation.MergedAnnotation; import org.springframework.util.CollectionUtils; @@ -121,6 +122,28 @@ public class SimpleAnnotationBatchChain extends BasicAn return this; } + /** + * 将多值合并为单值 + * + * @param reducer 合并器 + * @return 结果 + */ + @Override + public BeanPropertyAnnotationChain reduce(Function, R> reducer) { + R reduced = reducer.apply(values); + return new SimpleAnnotationChain<>(parent, reduced); + } + + /** + * 是否存在值 + * + * @return 结果 + */ + @Override + public boolean isPresent() { + return !CollectionUtils.isEmpty(values); + } + /** * 获取所有结果为list * @@ -132,4 +155,14 @@ public class SimpleAnnotationBatchChain extends BasicAn return mapped ? Collections.emptyList() : this.values.stream().map(item -> (MergedAnnotation) item) .map(MergedAnnotation::synthesize).collect(Collectors.toList()); } + + /** + * 缓存值逻辑 + * + * @return 父亲 + */ + @Override + protected BeanPropertyAnnotations cache() { + return parent.value(values); + } } diff --git a/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/chain/impl/SimpleAnnotationChain.java b/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/chain/impl/SimpleAnnotationChain.java index ec8a7fa..a292d57 100644 --- a/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/chain/impl/SimpleAnnotationChain.java +++ b/flyfish-bean/src/main/java/dev/flyfish/framework/beans/meta/parser/chain/impl/SimpleAnnotationChain.java @@ -111,6 +111,16 @@ public class SimpleAnnotationChain extends BasicAnnotat return this; } + /** + * 当前值是否存在 + * + * @return 结果 + */ + @Override + public boolean isPresent() { + return null != value; + } + /** * 直接获取结果 * @@ -122,4 +132,24 @@ public class SimpleAnnotationChain extends BasicAnnotat parent.last(false); return value instanceof MergedAnnotation ? ((MergedAnnotation) value).synthesize() : null; } + + /** + * 获取缓存的值 + * + * @return 结果 + */ + @Override + public T get() { + return value; + } + + /** + * 缓存值逻辑 + * + * @return 父亲 + */ + @Override + protected BeanPropertyAnnotations cache() { + return parent.value(value); + } }