From 5dab036360d9cbe23244655faed8dd8a7968d132 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=8B=E8=BE=9E=E6=9C=AA=E5=AF=92?= <545073804@qq.com> Date: Mon, 6 Jan 2025 03:19:18 +0000 Subject: [PATCH 1/3] =?UTF-8?q?enhance=20Converter=E6=94=AF=E6=8C=81Consum?= =?UTF-8?q?er=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 秋辞未寒 <545073804@qq.com> --- .../linpeilie/BaseCycleAvoidingMapper.java | 36 +++++++- .../io/github/linpeilie/BaseMapMapper.java | 10 +++ .../java/io/github/linpeilie/BaseMapper.java | 35 +++++++- .../java/io/github/linpeilie/Converter.java | 82 +++++++++++++------ 4 files changed, 134 insertions(+), 29 deletions(-) diff --git a/mapstruct-plus/src/main/java/io/github/linpeilie/BaseCycleAvoidingMapper.java b/mapstruct-plus/src/main/java/io/github/linpeilie/BaseCycleAvoidingMapper.java index 48c7773..d8dac15 100644 --- a/mapstruct-plus/src/main/java/io/github/linpeilie/BaseCycleAvoidingMapper.java +++ b/mapstruct-plus/src/main/java/io/github/linpeilie/BaseCycleAvoidingMapper.java @@ -1,22 +1,53 @@ package io.github.linpeilie; -import java.util.List; -import java.util.stream.Collectors; import org.mapstruct.Context; import org.mapstruct.MappingTarget; +import java.util.List; +import java.util.Objects; +import java.util.function.Consumer; +import java.util.stream.Collectors; + public interface BaseCycleAvoidingMapper extends BaseMapper { T convert(S source, @Context CycleAvoidingMappingContext context); + default T convert(S source, @Context CycleAvoidingMappingContext context, Consumer beanConsumer) { + T bean = convert(source,context); + if (Objects.nonNull(bean) && Objects.nonNull(beanConsumer)) { + beanConsumer.accept(bean); + } + return bean; + } + T convert(S source, @MappingTarget T target, @Context CycleAvoidingMappingContext context); + default T convert(S source, @MappingTarget T target, @Context CycleAvoidingMappingContext context, Consumer beanConsumer) { + T bean = convert(source,target,context); + if (Objects.nonNull(bean) && Objects.nonNull(beanConsumer)) { + beanConsumer.accept(bean); + } + return bean; + } + default List convert(List sourceList, @Context CycleAvoidingMappingContext context) { return sourceList.stream() .map(item -> convert(item, context)) .collect(Collectors.toList()); } + default List convert(List sourceList, @Context CycleAvoidingMappingContext context, Consumer beanConsumer) { + // 如果 beanConsumer 本来就为 null,则不再调用带 Consumer 参数的 convert 方法,避免在循环中进行不必要的非空判断 + if (Objects.nonNull(beanConsumer)) { + return sourceList.stream() + .map(source -> convert(source, beanConsumer)) + .collect(Collectors.toList()); + } + return sourceList.stream() + .map(item -> convert(item, context)) + .collect(Collectors.toList()); + } + @Override default T convert(S source) { return convert(source, new CycleAvoidingMappingContext()); @@ -27,7 +58,6 @@ public interface BaseCycleAvoidingMapper extends BaseMapper { return convert(source, new CycleAvoidingMappingContext()); } - @Override default List convert(List sourceList) { return convert(sourceList, new CycleAvoidingMappingContext()); diff --git a/mapstruct-plus/src/main/java/io/github/linpeilie/BaseMapMapper.java b/mapstruct-plus/src/main/java/io/github/linpeilie/BaseMapMapper.java index f9ca959..57a4793 100644 --- a/mapstruct-plus/src/main/java/io/github/linpeilie/BaseMapMapper.java +++ b/mapstruct-plus/src/main/java/io/github/linpeilie/BaseMapMapper.java @@ -1,9 +1,19 @@ package io.github.linpeilie; import java.util.Map; +import java.util.Objects; +import java.util.function.Consumer; public interface BaseMapMapper { T convert(Map map); + default T convert(Map map, Consumer beanConsumer) { + T bean = convert(map); + if (Objects.nonNull(bean) && Objects.nonNull(beanConsumer)) { + beanConsumer.accept(bean); + } + return bean; + } + } diff --git a/mapstruct-plus/src/main/java/io/github/linpeilie/BaseMapper.java b/mapstruct-plus/src/main/java/io/github/linpeilie/BaseMapper.java index eec5536..082b9ca 100644 --- a/mapstruct-plus/src/main/java/io/github/linpeilie/BaseMapper.java +++ b/mapstruct-plus/src/main/java/io/github/linpeilie/BaseMapper.java @@ -1,22 +1,53 @@ package io.github.linpeilie; import io.github.linpeilie.utils.CollectionUtils; +import org.mapstruct.MappingTarget; + import java.util.ArrayList; import java.util.List; +import java.util.Objects; +import java.util.function.Consumer; import java.util.stream.Collectors; -import org.mapstruct.MappingTarget; public interface BaseMapper { T convert(S source); + default T convert(S source, Consumer beanConsumer) { + T bean = convert(source); + if (Objects.nonNull(bean) && Objects.nonNull(beanConsumer)) { + beanConsumer.accept(bean); + } + return bean; + } + T convert(S source, @MappingTarget T target); + default T convert(S source, @MappingTarget T target, Consumer beanConsumer) { + T bean = convert(source,target); + if (Objects.nonNull(bean) && Objects.nonNull(beanConsumer)) { + beanConsumer.accept(bean); + } + return bean; + } + default List convert(List sourceList) { + return convert(sourceList, null); + } + + default List convert(List sourceList, Consumer beanConsumer) { if (CollectionUtils.isEmpty(sourceList)) { return new ArrayList<>(); } - return sourceList.stream().map(this::convert).collect(Collectors.toList()); + // 如果 beanConsumer 本来就为 null,则不再调用带 Consumer 参数的 convert 方法,避免在循环中进行不必要的非空判断 + if (Objects.nonNull(beanConsumer)) { + return sourceList.stream() + .map(source -> convert(source, beanConsumer)) + .collect(Collectors.toList()); + } + return sourceList.stream() + .map(this::convert) + .collect(Collectors.toList()); } } diff --git a/mapstruct-plus/src/main/java/io/github/linpeilie/Converter.java b/mapstruct-plus/src/main/java/io/github/linpeilie/Converter.java index 92ae3a7..8da2ef0 100644 --- a/mapstruct-plus/src/main/java/io/github/linpeilie/Converter.java +++ b/mapstruct-plus/src/main/java/io/github/linpeilie/Converter.java @@ -4,7 +4,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.stream.Collectors; +import java.util.function.Consumer; public class Converter { @@ -18,79 +18,113 @@ public class Converter { this.converterFactory = converterFactory; } - @SuppressWarnings("unchecked") public T convert(S source, Class targetType) { + return convert(source, targetType, (Consumer) null); + } + + @SuppressWarnings("unchecked") + public T convert(S source, Class targetType, Consumer beanConsumer) { if (source == null) { return null; } BaseMapper mapper = (BaseMapper) converterFactory.getMapper(source.getClass(), targetType); if (mapper != null) { - return mapper.convert(source); + return mapper.convert(source, beanConsumer); } throw new ConvertException( "cannot find converter from " + source.getClass().getSimpleName() + " to " + targetType.getSimpleName()); } - @SuppressWarnings("unchecked") public T convert(S source, T target) { + return convert(source, target, null); + } + + @SuppressWarnings("unchecked") + public T convert(S source, T target, Consumer beanConsumer) { if (source == null) { return null; } if (target == null) { return null; } - BaseMapper mapper = (BaseMapper) converterFactory.getMapper(source.getClass(), target.getClass()); + Class sourceClass = source.getClass(); + BaseMapper mapper = (BaseMapper) converterFactory.getMapper(sourceClass, target.getClass()); if (mapper != null) { - return mapper.convert(source, target); + return mapper.convert(source, target, beanConsumer); } - throw new ConvertException("cannot find converter from " + source.getClass().getSimpleName() + " to " + - target.getClass().getSimpleName()); + throw new ConvertException("cannot find converter from " + sourceClass.getSimpleName() + " to " + + target.getClass().getSimpleName()); } - public List convert(List source, Class targetType) { - if (source == null || source.isEmpty()) { + public List convert(List sourceList, Class targetType) { + return convert(sourceList, targetType, (Consumer) null); + } + + @SuppressWarnings("unchecked") + public List convert(List sourceList, Class targetType, Consumer beanConsumer) { + if (sourceList == null || sourceList.isEmpty()) { return new ArrayList<>(); } - return source.stream().map(item -> convert(item, targetType)).collect(Collectors.toList()); + Class sourceType = sourceList.getFirst().getClass(); + BaseMapper mapper = (BaseMapper) converterFactory.getMapper(sourceType, targetType); + if (mapper != null) { + return mapper.convert(sourceList, beanConsumer); + } + throw new ConvertException("cannot find converter from " + sourceType.getSimpleName() + " to " + + targetType.getSimpleName()); } + public T convert(S source, Class target, CycleAvoidingMappingContext context) { + return convert(source, target, context, null); + } @SuppressWarnings("unchecked") - public T convert(S source, Class target, CycleAvoidingMappingContext context) { + public T convert(S source, Class targetType, CycleAvoidingMappingContext context, Consumer beanConsumer) { if (source == null) { return null; } - BaseCycleAvoidingMapper mapper = - (BaseCycleAvoidingMapper) converterFactory.getCycleAvoidingMapper(source.getClass(), target); + BaseCycleAvoidingMapper mapper = (BaseCycleAvoidingMapper) converterFactory.getCycleAvoidingMapper(source.getClass(), targetType); if (mapper != null) { - return mapper.convert(source, context); + return mapper.convert(source, context, beanConsumer); } throw new ConvertException("cannot find converter from " + source.getClass().getSimpleName() + " to " + - target.getSimpleName()); + targetType.getSimpleName()); + } + + public List convert(List sourceList, Class targetType, CycleAvoidingMappingContext context) { + return convert(sourceList, targetType, context, null); } - public List convert(List source, Class targetType, CycleAvoidingMappingContext context) { - if (source == null || source.isEmpty()) { + @SuppressWarnings("unchecked") + public List convert(List sourceList, Class targetType, CycleAvoidingMappingContext context, Consumer beanConsumer) { + if (sourceList == null || sourceList.isEmpty()) { return new ArrayList<>(); } - return source.stream().map(item -> convert(item, targetType, context)).collect(Collectors.toList()); + Class sourceType = sourceList.getFirst().getClass(); + BaseCycleAvoidingMapper mapper = (BaseCycleAvoidingMapper) converterFactory.getCycleAvoidingMapper(sourceType, targetType); + if (mapper != null) { + return mapper.convert(sourceList, context, beanConsumer); + } + throw new ConvertException("cannot find converter from " + sourceType.getSimpleName() + " to " + targetType.getSimpleName()); } + public T convert(Map map, Class targetType) { + return convert(map, targetType, (Consumer) null); + } - - public T convert(Map map, Class target) { + public T convert(Map map, Class targetType, Consumer beanConsumer) { if (map == null || map.isEmpty()) { return null; } if (map.values().stream().allMatch(Objects::isNull)) { return null; } - final BaseMapMapper mapper = converterFactory.getMapMapper(target); + final BaseMapMapper mapper = converterFactory.getMapMapper(targetType); if (mapper != null) { - return mapper.convert(map); + return mapper.convert(map, beanConsumer); } throw new ConvertException("cannot find converter from " + map.getClass().getName() + " to " + - target.getSimpleName()); + targetType.getSimpleName()); } } -- Gitee From 2d6c2b5539e6c9623cc6f7f98637103334767d76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=8B=E8=BE=9E=E6=9C=AA=E5=AF=92?= <545073804@qq.com> Date: Mon, 6 Jan 2025 03:41:11 +0000 Subject: [PATCH 2/3] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 秋辞未寒 <545073804@qq.com> --- .../java/io/github/linpeilie/BaseCycleAvoidingMapper.java | 6 +++--- .../src/main/java/io/github/linpeilie/BaseMapper.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mapstruct-plus/src/main/java/io/github/linpeilie/BaseCycleAvoidingMapper.java b/mapstruct-plus/src/main/java/io/github/linpeilie/BaseCycleAvoidingMapper.java index d8dac15..78b4cde 100644 --- a/mapstruct-plus/src/main/java/io/github/linpeilie/BaseCycleAvoidingMapper.java +++ b/mapstruct-plus/src/main/java/io/github/linpeilie/BaseCycleAvoidingMapper.java @@ -13,7 +13,7 @@ public interface BaseCycleAvoidingMapper extends BaseMapper { T convert(S source, @Context CycleAvoidingMappingContext context); default T convert(S source, @Context CycleAvoidingMappingContext context, Consumer beanConsumer) { - T bean = convert(source,context); + T bean = convert(source, context); if (Objects.nonNull(bean) && Objects.nonNull(beanConsumer)) { beanConsumer.accept(bean); } @@ -23,7 +23,7 @@ public interface BaseCycleAvoidingMapper extends BaseMapper { T convert(S source, @MappingTarget T target, @Context CycleAvoidingMappingContext context); default T convert(S source, @MappingTarget T target, @Context CycleAvoidingMappingContext context, Consumer beanConsumer) { - T bean = convert(source,target,context); + T bean = convert(source, target, context); if (Objects.nonNull(bean) && Objects.nonNull(beanConsumer)) { beanConsumer.accept(bean); } @@ -40,7 +40,7 @@ public interface BaseCycleAvoidingMapper extends BaseMapper { // 如果 beanConsumer 本来就为 null,则不再调用带 Consumer 参数的 convert 方法,避免在循环中进行不必要的非空判断 if (Objects.nonNull(beanConsumer)) { return sourceList.stream() - .map(source -> convert(source, beanConsumer)) + .map(source -> convert(source, context, beanConsumer)) .collect(Collectors.toList()); } return sourceList.stream() diff --git a/mapstruct-plus/src/main/java/io/github/linpeilie/BaseMapper.java b/mapstruct-plus/src/main/java/io/github/linpeilie/BaseMapper.java index 082b9ca..7090769 100644 --- a/mapstruct-plus/src/main/java/io/github/linpeilie/BaseMapper.java +++ b/mapstruct-plus/src/main/java/io/github/linpeilie/BaseMapper.java @@ -24,7 +24,7 @@ public interface BaseMapper { T convert(S source, @MappingTarget T target); default T convert(S source, @MappingTarget T target, Consumer beanConsumer) { - T bean = convert(source,target); + T bean = convert(source, target); if (Objects.nonNull(bean) && Objects.nonNull(beanConsumer)) { beanConsumer.accept(bean); } -- Gitee From 231bbb9bdf0d4ae785ce7413eba52469e537314c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=8B=E8=BE=9E=E6=9C=AA=E5=AF=92?= <545073804@qq.com> Date: Mon, 13 Jan 2025 04:55:02 +0000 Subject: [PATCH 3/3] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20maps?= =?UTF-8?q?truct-plus/src/main/java/io/github/linpeilie/BaseCycleAvoidingM?= =?UTF-8?q?apper.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../linpeilie/BaseCycleAvoidingMapper.java | 66 ------------------- 1 file changed, 66 deletions(-) delete mode 100644 mapstruct-plus/src/main/java/io/github/linpeilie/BaseCycleAvoidingMapper.java diff --git a/mapstruct-plus/src/main/java/io/github/linpeilie/BaseCycleAvoidingMapper.java b/mapstruct-plus/src/main/java/io/github/linpeilie/BaseCycleAvoidingMapper.java deleted file mode 100644 index 78b4cde..0000000 --- a/mapstruct-plus/src/main/java/io/github/linpeilie/BaseCycleAvoidingMapper.java +++ /dev/null @@ -1,66 +0,0 @@ -package io.github.linpeilie; - -import org.mapstruct.Context; -import org.mapstruct.MappingTarget; - -import java.util.List; -import java.util.Objects; -import java.util.function.Consumer; -import java.util.stream.Collectors; - -public interface BaseCycleAvoidingMapper extends BaseMapper { - - T convert(S source, @Context CycleAvoidingMappingContext context); - - default T convert(S source, @Context CycleAvoidingMappingContext context, Consumer beanConsumer) { - T bean = convert(source, context); - if (Objects.nonNull(bean) && Objects.nonNull(beanConsumer)) { - beanConsumer.accept(bean); - } - return bean; - } - - T convert(S source, @MappingTarget T target, @Context CycleAvoidingMappingContext context); - - default T convert(S source, @MappingTarget T target, @Context CycleAvoidingMappingContext context, Consumer beanConsumer) { - T bean = convert(source, target, context); - if (Objects.nonNull(bean) && Objects.nonNull(beanConsumer)) { - beanConsumer.accept(bean); - } - return bean; - } - - default List convert(List sourceList, @Context CycleAvoidingMappingContext context) { - return sourceList.stream() - .map(item -> convert(item, context)) - .collect(Collectors.toList()); - } - - default List convert(List sourceList, @Context CycleAvoidingMappingContext context, Consumer beanConsumer) { - // 如果 beanConsumer 本来就为 null,则不再调用带 Consumer 参数的 convert 方法,避免在循环中进行不必要的非空判断 - if (Objects.nonNull(beanConsumer)) { - return sourceList.stream() - .map(source -> convert(source, context, beanConsumer)) - .collect(Collectors.toList()); - } - return sourceList.stream() - .map(item -> convert(item, context)) - .collect(Collectors.toList()); - } - - @Override - default T convert(S source) { - return convert(source, new CycleAvoidingMappingContext()); - } - - @Override - default T convert(S source, @MappingTarget T target) { - return convert(source, new CycleAvoidingMappingContext()); - } - - @Override - default List convert(List sourceList) { - return convert(sourceList, new CycleAvoidingMappingContext()); - } - -} -- Gitee