This commit is contained in:
Looly
2022-09-30 23:00:15 +08:00
parent 00fad42926
commit d6be80f8ea
22 changed files with 173 additions and 130 deletions

View File

@@ -1,20 +1,21 @@
package cn.hutool.core.io.file;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.func.Wrapper;
import cn.hutool.core.util.CharsetUtil;
import java.io.File;
import java.io.Serializable;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.CharsetUtil;
/**
* 文件包装器,扩展文件对象
*
* @author Looly
*
*/
public class FileWrapper implements Serializable{
public class FileWrapper implements Wrapper<File>, Serializable{
private static final long serialVersionUID = 1L;
protected File file;
@@ -40,7 +41,8 @@ public class FileWrapper implements Serializable{
* 获得文件
* @return 文件
*/
public File getFile() {
@Override
public File getRaw() {
return file;
}

View File

@@ -0,0 +1,17 @@
package cn.hutool.core.lang.func;
/**
* 包装接口
*
* @param <T> 原始对象类型
* @author looly
* @since 6.0.0
*/
public interface Wrapper<T> {
/**
* 获取原始对象
*
* @return 原始对象
*/
T getRaw();
}

View File

@@ -3,6 +3,7 @@ package cn.hutool.core.map;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.lang.func.Wrapper;
import cn.hutool.core.reflect.ClassUtil;
import cn.hutool.core.text.StrUtil;
import cn.hutool.core.util.ObjUtil;
@@ -33,6 +34,7 @@ import java.util.stream.Collectors;
* 也可以在获取到{@link TreeEntry}后,使用节点本身的方法对数进行操作或访问。
*
* @param <K> key类型
* @param <V> 值类型
* @author huangchengxing
*/
public class LinkedForestMap<K, V> implements ForestMap<K, V> {
@@ -48,11 +50,11 @@ public class LinkedForestMap<K, V> implements ForestMap<K, V> {
private final boolean allowOverrideParent;
/**
* 构建{@link LinkedForestMap}
* 构建{@code LinkedForestMap}
*
* @param allowOverrideParent 当指定节点已经与其他节点构成了父子关系,是否允许将该节点的父节点强制替换为指定节点
*/
public LinkedForestMap(boolean allowOverrideParent) {
public LinkedForestMap(final boolean allowOverrideParent) {
this.allowOverrideParent = allowOverrideParent;
this.nodes = new LinkedHashMap<>();
}
@@ -86,7 +88,7 @@ public class LinkedForestMap<K, V> implements ForestMap<K, V> {
* @return 是否
*/
@Override
public boolean containsKey(Object key) {
public boolean containsKey(final Object key) {
return nodes.containsKey(key);
}
@@ -97,7 +99,7 @@ public class LinkedForestMap<K, V> implements ForestMap<K, V> {
* @return 是否
*/
@Override
public boolean containsValue(Object value) {
public boolean containsValue(final Object value) {
return nodes.containsValue(value);
}
@@ -108,7 +110,7 @@ public class LinkedForestMap<K, V> implements ForestMap<K, V> {
* @return 节点
*/
@Override
public TreeEntry<K, V> get(Object key) {
public TreeEntry<K, V> get(final Object key) {
return nodes.get(key);
}
@@ -126,7 +128,7 @@ public class LinkedForestMap<K, V> implements ForestMap<K, V> {
* @return 删除的且引用关系已经改变的节点若key没有对应节点则返回null
*/
@Override
public TreeEntry<K, V> remove(Object key) {
public TreeEntry<K, V> remove(final Object key) {
final TreeEntryNode<K, V> target = nodes.remove(key);
if (ObjUtil.isNull(target)) {
return null;
@@ -189,7 +191,7 @@ public class LinkedForestMap<K, V> implements ForestMap<K, V> {
/**
* 将{@link TreeEntryNode}包装为{@link EntryNodeWrapper}
*/
private Map.Entry<K, TreeEntry<K, V>> wrap(Map.Entry<K, TreeEntryNode<K, V>> nodeEntry) {
private Map.Entry<K, TreeEntry<K, V>> wrap(final Map.Entry<K, TreeEntryNode<K, V>> nodeEntry) {
return new EntryNodeWrapper<>(nodeEntry.getValue());
}
@@ -207,7 +209,7 @@ public class LinkedForestMap<K, V> implements ForestMap<K, V> {
* @return 节点若key已有对应节点则返回具有旧值的节点否则返回null
*/
@Override
public TreeEntryNode<K, V> putNode(K key, V value) {
public TreeEntryNode<K, V> putNode(final K key, final V value) {
TreeEntryNode<K, V> target = nodes.get(key);
if (ObjUtil.isNotNull(target)) {
final V oldVal = target.getValue();
@@ -238,7 +240,7 @@ public class LinkedForestMap<K, V> implements ForestMap<K, V> {
* @param childValue 子节点的值
*/
@Override
public void putLinkedNodes(K parentKey, V parentValue, K childKey, V childValue) {
public void putLinkedNodes(final K parentKey, final V parentValue, final K childKey, final V childValue) {
linkNodes(parentKey, childKey, (parent, child) -> {
parent.setValue(parentValue);
child.setValue(childValue);
@@ -257,7 +259,7 @@ public class LinkedForestMap<K, V> implements ForestMap<K, V> {
* @param childValue 子节点的值
*/
@Override
public void putLinkedNodes(K parentKey, K childKey, V childValue) {
public void putLinkedNodes(final K parentKey, final K childKey, final V childValue) {
linkNodes(parentKey, childKey, (parent, child) -> child.setValue(childValue));
}
@@ -269,7 +271,7 @@ public class LinkedForestMap<K, V> implements ForestMap<K, V> {
* @param consumer 对父节点和子节点的操作允许为null
*/
@Override
public void linkNodes(K parentKey, K childKey, BiConsumer<TreeEntry<K, V>, TreeEntry<K, V>> consumer) {
public void linkNodes(final K parentKey, final K childKey, BiConsumer<TreeEntry<K, V>, TreeEntry<K, V>> consumer) {
consumer = ObjUtil.defaultIfNull(consumer, (parent, child) -> {
});
final TreeEntryNode<K, V> parentNode = nodes.computeIfAbsent(parentKey, t -> new TreeEntryNode<>(null, t));
@@ -315,7 +317,7 @@ public class LinkedForestMap<K, V> implements ForestMap<K, V> {
* @param childKey 子节点
*/
@Override
public void unlinkNode(K parentKey, K childKey) {
public void unlinkNode(final K parentKey, final K childKey) {
final TreeEntryNode<K, V> childNode = nodes.get(childKey);
if (ObjUtil.isNull(childNode)) {
return;
@@ -369,7 +371,7 @@ public class LinkedForestMap<K, V> implements ForestMap<K, V> {
* @param parent 节点的父节点
* @param key 节点的key
*/
public TreeEntryNode(TreeEntryNode<K, V> parent, K key) {
public TreeEntryNode(final TreeEntryNode<K, V> parent, final K key) {
this(parent, key, null);
}
@@ -380,7 +382,7 @@ public class LinkedForestMap<K, V> implements ForestMap<K, V> {
* @param key 节点的key
* @param value 节点的value
*/
public TreeEntryNode(TreeEntryNode<K, V> parent, K key, V value) {
public TreeEntryNode(final TreeEntryNode<K, V> parent, final K key, final V value) {
this.parent = parent;
this.key = key;
this.value = value;
@@ -432,7 +434,7 @@ public class LinkedForestMap<K, V> implements ForestMap<K, V> {
* @return 节点的旧value
*/
@Override
public V setValue(V value) {
public V setValue(final V value) {
final V oldVal = getValue();
this.value = value;
return oldVal;
@@ -449,7 +451,7 @@ public class LinkedForestMap<K, V> implements ForestMap<K, V> {
* @return 遍历到的最后一个节点
*/
TreeEntryNode<K, V> traverseParentNodes(
boolean includeCurrent, Consumer<TreeEntryNode<K, V>> consumer, Predicate<TreeEntryNode<K, V>> breakTraverse) {
final boolean includeCurrent, final Consumer<TreeEntryNode<K, V>> consumer, Predicate<TreeEntryNode<K, V>> breakTraverse) {
breakTraverse = ObjUtil.defaultIfNull(breakTraverse, n -> false);
TreeEntryNode<K, V> curr = includeCurrent ? this : this.parent;
while (ObjUtil.isNotNull(curr)) {
@@ -504,7 +506,7 @@ public class LinkedForestMap<K, V> implements ForestMap<K, V> {
* @return 指定父节点当不存在时返回null
*/
@Override
public TreeEntryNode<K, V> getParent(K key) {
public TreeEntryNode<K, V> getParent(final K key) {
return traverseParentNodes(false, p -> {
}, p -> p.equalsKey(key));
}
@@ -516,7 +518,7 @@ public class LinkedForestMap<K, V> implements ForestMap<K, V> {
* @param nodeConsumer 对节点的处理
*/
@Override
public void forEachChild(boolean includeSelf, Consumer<TreeEntry<K, V>> nodeConsumer) {
public void forEachChild(final boolean includeSelf, final Consumer<TreeEntry<K, V>> nodeConsumer) {
traverseChildNodes(includeSelf, (index, child) -> nodeConsumer.accept(child), null);
}
@@ -526,7 +528,7 @@ public class LinkedForestMap<K, V> implements ForestMap<K, V> {
* @param key 要比较的key
* @return 是否key一致
*/
public boolean equalsKey(K key) {
public boolean equalsKey(final K key) {
return ObjUtil.equals(getKey(), key);
}
@@ -541,7 +543,7 @@ public class LinkedForestMap<K, V> implements ForestMap<K, V> {
* @return 遍历到的最后一个节点
*/
TreeEntryNode<K, V> traverseChildNodes(
boolean includeCurrent, BiConsumer<Integer, TreeEntryNode<K, V>> consumer, BiPredicate<Integer, TreeEntryNode<K, V>> breakTraverse) {
final boolean includeCurrent, final BiConsumer<Integer, TreeEntryNode<K, V>> consumer, BiPredicate<Integer, TreeEntryNode<K, V>> breakTraverse) {
breakTraverse = ObjUtil.defaultIfNull(breakTraverse, (i, n) -> false);
final Deque<List<TreeEntryNode<K, V>>> keyNodeDeque = ListUtil.ofLinked(ListUtil.of(this));
boolean needProcess = includeCurrent;
@@ -577,7 +579,7 @@ public class LinkedForestMap<K, V> implements ForestMap<K, V> {
* @param child 子节点
* @throws IllegalArgumentException 当要添加的子节点已经是其自身父节点时抛出
*/
void addChild(TreeEntryNode<K, V> child) {
void addChild(final TreeEntryNode<K, V> child) {
if (containsChild(child.key)) {
return;
}
@@ -605,7 +607,7 @@ public class LinkedForestMap<K, V> implements ForestMap<K, V> {
*
* @param key 子节点
*/
void removeDeclaredChild(K key) {
void removeDeclaredChild(final K key) {
final TreeEntryNode<K, V> child = children.get(key);
if (ObjUtil.isNull(child)) {
return;
@@ -629,7 +631,7 @@ public class LinkedForestMap<K, V> implements ForestMap<K, V> {
* @return 节点
*/
@Override
public TreeEntryNode<K, V> getChild(K key) {
public TreeEntryNode<K, V> getChild(final K key) {
return traverseChildNodes(false, (i, c) -> {
}, (i, c) -> c.equalsKey(key));
}
@@ -673,7 +675,7 @@ public class LinkedForestMap<K, V> implements ForestMap<K, V> {
* @return 是否
*/
@Override
public boolean equals(Object o) {
public boolean equals(final Object o) {
if (this == o) {
return true;
}
@@ -701,8 +703,8 @@ public class LinkedForestMap<K, V> implements ForestMap<K, V> {
* @param value 复制的节点的值
* @return 节点
*/
TreeEntryNode<K, V> copy(V value) {
TreeEntryNode<K, V> copiedNode = new TreeEntryNode<>(this.parent, this.key, ObjUtil.defaultIfNull(value, this.value));
TreeEntryNode<K, V> copy(final V value) {
final TreeEntryNode<K, V> copiedNode = new TreeEntryNode<>(this.parent, this.key, ObjUtil.defaultIfNull(value, this.value));
copiedNode.children.putAll(children);
return copiedNode;
}
@@ -718,10 +720,10 @@ public class LinkedForestMap<K, V> implements ForestMap<K, V> {
* @see #entrySet()
* @see #values()
*/
public static class EntryNodeWrapper<K, V, N extends TreeEntry<K, V>> implements Map.Entry<K, TreeEntry<K, V>> {
public static class EntryNodeWrapper<K, V, N extends TreeEntry<K, V>> implements Map.Entry<K, TreeEntry<K, V>>, Wrapper<N> {
private final N entryNode;
EntryNodeWrapper(N entryNode) {
EntryNodeWrapper(final N entryNode) {
this.entryNode = entryNode;
}
@@ -736,9 +738,14 @@ public class LinkedForestMap<K, V> implements ForestMap<K, V> {
}
@Override
public TreeEntry<K, V> setValue(TreeEntry<K, V> value) {
public TreeEntry<K, V> setValue(final TreeEntry<K, V> value) {
throw new UnsupportedOperationException();
}
@Override
public N getRaw() {
return entryNode;
}
}
}

View File

@@ -1,6 +1,7 @@
package cn.hutool.core.map;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.lang.func.Wrapper;
import cn.hutool.core.util.ObjUtil;
import java.io.IOException;
@@ -21,7 +22,7 @@ import java.util.function.Supplier;
* @author looly
* @since 4.3.3
*/
public class MapWrapper<K, V> implements Map<K, V>, Iterable<Map.Entry<K, V>>, Serializable, Cloneable {
public class MapWrapper<K, V> implements Map<K, V>, Iterable<Map.Entry<K, V>>, Wrapper<Map<K, V>>, Serializable, Cloneable {
private static final long serialVersionUID = -7524578042008586382L;
/**
@@ -64,6 +65,7 @@ public class MapWrapper<K, V> implements Map<K, V>, Iterable<Map.Entry<K, V>>, S
*
* @return Map
*/
@Override
public Map<K, V> getRaw() {
return this.raw;
}