diff --git a/hutool-core/src/main/java/cn/hutool/core/annotation/SynthesizedAnnotationSelector.java b/hutool-core/src/main/java/cn/hutool/core/annotation/SynthesizedAnnotationSelector.java index b6383fe30..d0591bdfd 100644 --- a/hutool-core/src/main/java/cn/hutool/core/annotation/SynthesizedAnnotationSelector.java +++ b/hutool-core/src/main/java/cn/hutool/core/annotation/SynthesizedAnnotationSelector.java @@ -32,6 +32,7 @@ public interface SynthesizedAnnotationSelector { /** * 比较两个被合成的注解,选择其中的一个并返回 * + * @param 复合注解类型 * @param oldAnnotation 已存在的注解,该参数不允许为空 * @param newAnnotation 新获取的注解,该参数不允许为空 * @return 被合成的注解 diff --git a/hutool-core/src/main/java/cn/hutool/core/annotation/scanner/AbstractTypeAnnotationScanner.java b/hutool-core/src/main/java/cn/hutool/core/annotation/scanner/AbstractTypeAnnotationScanner.java index 39a4841ef..4d88701e0 100644 --- a/hutool-core/src/main/java/cn/hutool/core/annotation/scanner/AbstractTypeAnnotationScanner.java +++ b/hutool-core/src/main/java/cn/hutool/core/annotation/scanner/AbstractTypeAnnotationScanner.java @@ -74,7 +74,7 @@ public abstract class AbstractTypeAnnotationScanner(); - this.typedThis = (T)this; + this.typedThis = (T) this; } /** @@ -219,16 +219,22 @@ public abstract class AbstractTypeAnnotationScanner> accessedTypes, Class targetClass) { return ObjectUtil.isNull(targetClass) - || accessedTypes.contains(targetClass) - || excludeTypes.contains(targetClass) - || filter.negate().test(targetClass); + || accessedTypes.contains(targetClass) + || excludeTypes.contains(targetClass) + || filter.negate().test(targetClass); } /** * 若{@link #includeInterfaces}为{@code true},则将目标类的父接口也添加到nextClasses + * + * @param nextClasses 下一个类集合 + * @param targetClass 目标类型 */ protected void scanInterfaceIfNecessary(List> nextClasses, Class targetClass) { if (includeInterfaces) { @@ -241,6 +247,9 @@ public abstract class AbstractTypeAnnotationScanner> nextClassQueue, Class targetClass) { if (includeSupperClass) { @@ -253,6 +262,8 @@ public abstract class AbstractTypeAnnotationScanner convert(Class target) { if (hasConverters) { diff --git a/hutool-core/src/main/java/cn/hutool/core/map/ForestMap.java b/hutool-core/src/main/java/cn/hutool/core/map/ForestMap.java index 2fa21fe18..fd0951f8d 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/ForestMap.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/ForestMap.java @@ -66,7 +66,7 @@ public interface ForestMap extends Map> { *
  • 若存在父节点或子节点,则将其断开其与父节点或子节点的引用关系;
  • *
  • * 若同时存在父节点或子节点,则会在删除后将让子节点直接成为父节点的子节点,比如:
    - * 现有引用关系 a -> b -> c,删除 b 后,将有 a -> c + * 现有引用关系 a -> b -> c,删除 b 后,将有 a -> c *
  • * * @@ -87,13 +87,14 @@ public interface ForestMap extends Map> { /** * 批量添加节点 * + * @param 集合类型 * @param values 要添加的值 * @param keyGenerator 从值中获取key的方法 * @param parentKeyGenerator 从值中获取父节点key的方法 * @param ignoreNullNode 是否获取到的key为null的子节点/父节点 */ default > void putAllNode( - C values, Function keyGenerator, Function parentKeyGenerator, boolean ignoreNullNode) { + C values, Function keyGenerator, Function parentKeyGenerator, boolean ignoreNullNode) { if (CollUtil.isEmpty(values)) { return; } @@ -102,8 +103,8 @@ public interface ForestMap extends Map> { final K parentKey = parentKeyGenerator.apply(v); // 不忽略keu为null节点 - boolean hasKey = ObjectUtil.isNotNull(key); - boolean hasParentKey = ObjectUtil.isNotNull(parentKey); + final boolean hasKey = ObjectUtil.isNotNull(key); + final boolean hasParentKey = ObjectUtil.isNotNull(parentKey); if (!ignoreNullNode || (hasKey && hasParentKey)) { linkNodes(parentKey, key); get(key).setValue(v); @@ -207,7 +208,7 @@ public interface ForestMap extends Map> { /** * 获取指定节点所在树结构的全部树节点
    - * 比如:存在 a -> b -> c 的关系,则输入 a/b/c 都将返回 a, b, c + * 比如:存在 a -> b -> c 的关系,则输入 a/b/c 都将返回 a, b, c * * @param key 指定节点的key * @return 节点 @@ -217,47 +218,48 @@ public interface ForestMap extends Map> { if (ObjectUtil.isNull(target)) { return Collections.emptySet(); } - Set> results = CollUtil.newLinkedHashSet(target.getRoot()); + final Set> results = CollUtil.newLinkedHashSet(target.getRoot()); CollUtil.addAll(results, target.getRoot().getChildren().values()); return results; } /** * 获取以指定节点作为叶子节点的树结构,然后获取该树结构的根节点
    - * 比如:存在 a -> b -> c 的关系,则输入 a/b/c 都将返回 a + * 比如:存在 a -> b -> c 的关系,则输入 a/b/c 都将返回 a * * @param key 指定节点的key * @return 节点 */ default TreeEntry getRootNode(K key) { return Opt.ofNullable(get(key)) - .map(TreeEntry::getRoot) - .orElse(null); + .map(TreeEntry::getRoot) + .orElse(null); } /** * 获取指定节点的直接父节点
    - * 比如:若存在 a -> b -> c 的关系,此时输入 a 将返回 null,输入 b 将返回 a,输入 c 将返回 b + * 比如:若存在 a -> b -> c 的关系,此时输入 a 将返回 null,输入 b 将返回 a,输入 c 将返回 b * * @param key 指定节点的key * @return 节点 */ default TreeEntry getDeclaredParentNode(K key) { return Opt.ofNullable(get(key)) - .map(TreeEntry::getDeclaredParent) - .orElse(null); + .map(TreeEntry::getDeclaredParent) + .orElse(null); } /** * 获取以指定节点作为叶子节点的树结构,然后获取该树结构中指定节点的指定父节点 * - * @param key 指定父节点的key + * @param key 指定节点的key + * @param parentKey 指定父节点key * @return 节点 */ default TreeEntry getParentNode(K key, K parentKey) { return Opt.ofNullable(get(key)) - .map(t -> t.getParent(parentKey)) - .orElse(null); + .map(t -> t.getParent(parentKey)) + .orElse(null); } /** @@ -269,8 +271,8 @@ public interface ForestMap extends Map> { */ default boolean containsParentNode(K key, K parentKey) { return Opt.ofNullable(get(key)) - .map(m -> m.containsParent(parentKey)) - .orElse(false); + .map(m -> m.containsParent(parentKey)) + .orElse(false); } // ===================== 子节点相关方法 ===================== @@ -284,36 +286,36 @@ public interface ForestMap extends Map> { */ default boolean containsChildNode(K parentKey, K childKey) { return Opt.ofNullable(get(parentKey)) - .map(m -> m.containsChild(childKey)) - .orElse(false); + .map(m -> m.containsChild(childKey)) + .orElse(false); } /** * 获取指定父节点直接关联的子节点
    - * 比如:若存在 a -> b -> c 的关系,此时输入 b 将返回 c,输入 a 将返回 b + * 比如:若存在 a -> b -> c 的关系,此时输入 b 将返回 c,输入 a 将返回 b * * @param key key * @return 节点 */ default Collection> getDeclaredChildNodes(K key) { return Opt.ofNullable(get(key)) - .map(TreeEntry::getDeclaredChildren) - .map(Map::values) - .orElseGet(Collections::emptyList); + .map(TreeEntry::getDeclaredChildren) + .map(Map::values) + .orElseGet(Collections::emptyList); } /** * 获取指定父节点的全部子节点
    - * 比如:若存在 a -> b -> c 的关系,此时输入 b 将返回 c,输入 a 将返回 b,c + * 比如:若存在 a -> b -> c 的关系,此时输入 b 将返回 c,输入 a 将返回 b,c * * @param key key * @return 该节点的全部子节点 */ default Collection> getChildNodes(K key) { return Opt.ofNullable(get(key)) - .map(TreeEntry::getChildren) - .map(Map::values) - .orElseGet(Collections::emptyList); + .map(TreeEntry::getChildren) + .map(Map::values) + .orElseGet(Collections::emptyList); } } diff --git a/hutool-core/src/main/java/cn/hutool/core/map/LinkedForestMap.java b/hutool-core/src/main/java/cn/hutool/core/map/LinkedForestMap.java index e030ae230..18ce1f05b 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/LinkedForestMap.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/LinkedForestMap.java @@ -131,7 +131,7 @@ public class LinkedForestMap implements ForestMap { final Map> targetChildren = target.getChildren(); parent.removeDeclaredChild(target.getKey()); target.clear(); - targetChildren.forEach((k, c) -> parent.addChild((TreeEntryNode)c)); + targetChildren.forEach((k, c) -> parent.addChild((TreeEntryNode) c)); } return target; } @@ -174,8 +174,8 @@ public class LinkedForestMap implements ForestMap { @Override public Set>> entrySet() { return nodes.entrySet().stream() - .map(this::wrap) - .collect(Collectors.toSet()); + .map(this::wrap) + .collect(Collectors.toSet()); } /** @@ -262,7 +262,8 @@ public class LinkedForestMap implements ForestMap { */ @Override public void linkNodes(K parentKey, K childKey, BiConsumer, TreeEntry> consumer) { - consumer = ObjectUtil.defaultIfNull(consumer, (parent, child) -> {}); + consumer = ObjectUtil.defaultIfNull(consumer, (parent, child) -> { + }); final TreeEntryNode parentNode = nodes.computeIfAbsent(parentKey, t -> new TreeEntryNode<>(null, t)); TreeEntryNode childNode = nodes.get(childKey); @@ -290,10 +291,10 @@ public class LinkedForestMap implements ForestMap { parentNode.addChild(childNode); } // 5.子节点存在,且已经与其他节点构成父子关系,但是不允许子节点直接修改其父节点 - else{ + else { throw new IllegalArgumentException(StrUtil.format( - "[{}] has been used as child of [{}], can not be overwrite as child of [{}]", - childNode.getKey(), childNode.getDeclaredParent().getKey(), parentKey + "[{}] has been used as child of [{}], can not be overwrite as child of [{}]", + childNode.getKey(), childNode.getDeclaredParent().getKey(), parentKey )); } consumer.accept(parentNode, childNode); @@ -358,18 +359,18 @@ public class LinkedForestMap implements ForestMap { * 创建一个节点 * * @param parent 节点的父节点 - * @param key 节点的key + * @param key 节点的key */ public TreeEntryNode(TreeEntryNode parent, K key) { - this(parent, key , null); + this(parent, key, null); } /** * 创建一个节点 * * @param parent 节点的父节点 - * @param key 节点的key - * @param value 节点的value + * @param key 节点的key + * @param value 节点的value */ public TreeEntryNode(TreeEntryNode parent, K key, V value) { this.parent = parent; @@ -440,7 +441,7 @@ public class LinkedForestMap implements ForestMap { * @return 遍历到的最后一个节点 */ TreeEntryNode traverseParentNodes( - boolean includeCurrent, Consumer> consumer, Predicate> breakTraverse) { + boolean includeCurrent, Consumer> consumer, Predicate> breakTraverse) { breakTraverse = ObjectUtil.defaultIfNull(breakTraverse, n -> false); TreeEntryNode curr = includeCurrent ? this : this.parent; while (ObjectUtil.isNotNull(curr)) { @@ -472,7 +473,8 @@ public class LinkedForestMap implements ForestMap { if (ObjectUtil.isNotNull(this.root)) { return this.root; } else { - this.root = traverseParentNodes(true, p -> {}, p -> !p.hasParent()); + this.root = traverseParentNodes(true, p -> { + }, p -> !p.hasParent()); } return this.root; } @@ -495,13 +497,14 @@ public class LinkedForestMap implements ForestMap { */ @Override public TreeEntryNode getParent(K key) { - return traverseParentNodes(false, p -> {}, p -> p.equalsKey(key)); + return traverseParentNodes(false, p -> { + }, p -> p.equalsKey(key)); } /** * 获取以当前节点作为根节点的树结构,然后遍历所有节点 * - * @param includeSelf 是否处理当前节点 + * @param includeSelf 是否处理当前节点 * @param nodeConsumer 对节点的处理 */ @Override @@ -513,6 +516,7 @@ public class LinkedForestMap implements ForestMap { * 指定key与当前节点的key是否相等 * * @param key 要比较的key + * @return 是否key一致 */ public boolean equalsKey(K key) { return ObjectUtil.equal(getKey(), key); @@ -529,7 +533,7 @@ public class LinkedForestMap implements ForestMap { * @return 遍历到的最后一个节点 */ TreeEntryNode traverseChildNodes( - boolean includeCurrent, BiConsumer> consumer, BiPredicate> breakTraverse) { + boolean includeCurrent, BiConsumer> consumer, BiPredicate> breakTraverse) { breakTraverse = ObjectUtil.defaultIfNull(breakTraverse, (i, n) -> false); final Deque>> keyNodeDeque = CollUtil.newLinkedList(CollUtil.newArrayList(this)); boolean needProcess = includeCurrent; @@ -572,9 +576,9 @@ public class LinkedForestMap implements ForestMap { // 检查循环引用 traverseParentNodes(true, s -> Assert.notEquals( - s.key, child.key, - "circular reference between [{}] and [{}]!", - s.key, this.key + s.key, child.key, + "circular reference between [{}] and [{}]!", + s.key, this.key ), null); // 调整该节点的信息 @@ -594,7 +598,7 @@ public class LinkedForestMap implements ForestMap { * @param key 子节点 */ void removeDeclaredChild(K key) { - TreeEntryNode child = children.get(key); + final TreeEntryNode child = children.get(key); if (ObjectUtil.isNull(child)) { return; } @@ -618,7 +622,8 @@ public class LinkedForestMap implements ForestMap { */ @Override public TreeEntryNode getChild(K key) { - return traverseChildNodes(false, (i, c) -> {}, (i, c) -> c.equalsKey(key)); + return traverseChildNodes(false, (i, c) -> { + }, (i, c) -> c.equalsKey(key)); } /** @@ -667,7 +672,7 @@ public class LinkedForestMap implements ForestMap { if (o == null || this.getClass().equals(o.getClass()) || ClassUtil.isAssignable(this.getClass(), o.getClass())) { return false; } - final TreeEntry treeEntry = (TreeEntry)o; + final TreeEntry treeEntry = (TreeEntry) o; return ObjectUtil.equals(this.getKey(), treeEntry.getKey()); } @@ -707,17 +712,21 @@ public class LinkedForestMap implements ForestMap { */ public static class EntryNodeWrapper> implements Map.Entry> { private final N entryNode; + EntryNodeWrapper(N entryNode) { this.entryNode = entryNode; } + @Override public K getKey() { return entryNode.getKey(); } + @Override public TreeEntry getValue() { return entryNode; } + @Override public TreeEntry setValue(TreeEntry value) { throw new UnsupportedOperationException();