This commit is contained in:
Looly 2022-09-27 23:38:05 +08:00
parent 246e61678e
commit d458b1451c
80 changed files with 227 additions and 192 deletions

View File

@ -2,7 +2,7 @@ package cn.hutool.core.classloader;
import cn.hutool.core.exceptions.UtilException; import cn.hutool.core.exceptions.UtilException;
import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.FileUtil;
import cn.hutool.core.net.URLUtil; import cn.hutool.core.net.url.URLUtil;
import cn.hutool.core.reflect.MethodUtil; import cn.hutool.core.reflect.MethodUtil;
import java.io.File; import java.io.File;

View File

@ -13,7 +13,13 @@ import cn.hutool.core.text.StrUtil;
*/ */
public class Base16Codec implements Encoder<byte[], char[]>, Decoder<CharSequence, byte[]> { public class Base16Codec implements Encoder<byte[], char[]>, Decoder<CharSequence, byte[]> {
/**
* 编码解码器小写
*/
public static final Base16Codec CODEC_LOWER = new Base16Codec(true); public static final Base16Codec CODEC_LOWER = new Base16Codec(true);
/**
* 编码解码器大写
*/
public static final Base16Codec CODEC_UPPER = new Base16Codec(false); public static final Base16Codec CODEC_UPPER = new Base16Codec(false);
private final char[] alphabets; private final char[] alphabets;

View File

@ -166,7 +166,9 @@ public class PercentCodec implements Encoder<byte[], byte[]>, Serializable {
* @author looly * @author looly
* @since 6.0.0 * @since 6.0.0
*/ */
public static class Builder implements cn.hutool.core.builder.Builder<PercentCodec> { public static class Builder implements cn.hutool.core.lang.builder.Builder<PercentCodec> {
private static final long serialVersionUID = 1L;
/** /**
* 从已知PercentCodec创建PercentCodec会复制给定PercentCodec的安全字符 * 从已知PercentCodec创建PercentCodec会复制给定PercentCodec的安全字符
* *

View File

@ -2,7 +2,7 @@ package cn.hutool.core.compiler;
import cn.hutool.core.util.CharUtil; import cn.hutool.core.util.CharUtil;
import cn.hutool.core.net.URLUtil; import cn.hutool.core.net.url.URLUtil;
import javax.tools.SimpleJavaFileObject; import javax.tools.SimpleJavaFileObject;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;

View File

@ -8,7 +8,7 @@ import cn.hutool.core.io.resource.FileResource;
import cn.hutool.core.io.resource.Resource; import cn.hutool.core.io.resource.Resource;
import cn.hutool.core.io.resource.StringResource; import cn.hutool.core.io.resource.StringResource;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.hutool.core.net.URLUtil; import cn.hutool.core.net.url.URLUtil;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.ObjUtil;

View File

@ -2,7 +2,7 @@ package cn.hutool.core.compiler;
import cn.hutool.core.io.IoUtil; import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.CharUtil; import cn.hutool.core.util.CharUtil;
import cn.hutool.core.net.URLUtil; import cn.hutool.core.net.url.URLUtil;
import javax.tools.SimpleJavaFileObject; import javax.tools.SimpleJavaFileObject;
import java.io.BufferedInputStream; import java.io.BufferedInputStream;

View File

@ -20,7 +20,7 @@ import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.reflect.ClassUtil; import cn.hutool.core.reflect.ClassUtil;
import cn.hutool.core.regex.ReUtil; import cn.hutool.core.regex.ReUtil;
import cn.hutool.core.text.StrUtil; import cn.hutool.core.text.StrUtil;
import cn.hutool.core.net.URLUtil; import cn.hutool.core.net.url.URLUtil;
import cn.hutool.core.compress.ZipUtil; import cn.hutool.core.compress.ZipUtil;
import java.io.BufferedInputStream; import java.io.BufferedInputStream;

View File

@ -3,7 +3,7 @@ package cn.hutool.core.io.resource;
import cn.hutool.core.classloader.ClassLoaderUtil; import cn.hutool.core.classloader.ClassLoaderUtil;
import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import cn.hutool.core.net.URLUtil; import cn.hutool.core.net.url.URLUtil;
import cn.hutool.core.text.StrUtil; import cn.hutool.core.text.StrUtil;
import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.ObjUtil;

View File

@ -3,7 +3,7 @@ package cn.hutool.core.io.resource;
import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.net.URLUtil; import cn.hutool.core.net.url.URLUtil;
import java.io.File; import java.io.File;
import java.io.InputStream; import java.io.InputStream;

View File

@ -7,7 +7,7 @@ import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.classloader.ClassLoaderUtil; import cn.hutool.core.classloader.ClassLoaderUtil;
import cn.hutool.core.text.StrUtil; import cn.hutool.core.text.StrUtil;
import cn.hutool.core.net.URLUtil; import cn.hutool.core.net.url.URLUtil;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.File; import java.io.File;

View File

@ -2,7 +2,7 @@ package cn.hutool.core.io.resource;
import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.net.URLUtil; import cn.hutool.core.net.url.URLUtil;
import java.io.File; import java.io.File;
import java.io.InputStream; import java.io.InputStream;

View File

@ -4,7 +4,7 @@ import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.watch.watchers.WatcherChain; import cn.hutool.core.io.watch.watchers.WatcherChain;
import cn.hutool.core.text.StrUtil; import cn.hutool.core.text.StrUtil;
import cn.hutool.core.net.URLUtil; import cn.hutool.core.net.url.URLUtil;
import cn.hutool.core.util.CharUtil; import cn.hutool.core.util.CharUtil;
import java.io.File; import java.io.File;

View File

@ -1,7 +1,7 @@
package cn.hutool.core.io.watch; package cn.hutool.core.io.watch;
import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.net.URLUtil; import cn.hutool.core.net.url.URLUtil;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;

View File

@ -1,4 +1,4 @@
package cn.hutool.core.builder; package cn.hutool.core.lang.builder;
import java.io.Serializable; import java.io.Serializable;

View File

@ -1,4 +1,4 @@
package cn.hutool.core.builder; package cn.hutool.core.lang.builder;
import cn.hutool.core.lang.func.SerConsumer3; import cn.hutool.core.lang.func.SerConsumer3;
@ -55,6 +55,7 @@ import java.util.function.Supplier;
* *
* @author TomXin VampireAchao * @author TomXin VampireAchao
* @since 5.7.21 * @since 5.7.21
* @param <T> 构建对象类型
*/ */
public class GenericBuilder<T> implements Builder<T> { public class GenericBuilder<T> implements Builder<T> {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;

View File

@ -5,4 +5,4 @@
* @author looly * @author looly
* *
*/ */
package cn.hutool.core.builder; package cn.hutool.core.lang.builder;

View File

@ -1,7 +1,7 @@
package cn.hutool.core.map; package cn.hutool.core.map;
import cn.hutool.core.builder.Builder; import cn.hutool.core.lang.builder.Builder;
import java.util.Map; import java.util.Map;
import java.util.function.Supplier; import java.util.function.Supplier;

View File

@ -1,6 +1,6 @@
package cn.hutool.core.map.multi; package cn.hutool.core.map.multi;
import cn.hutool.core.builder.Builder; import cn.hutool.core.lang.builder.Builder;
import cn.hutool.core.collection.iter.ComputeIter; import cn.hutool.core.collection.iter.ComputeIter;
import cn.hutool.core.collection.iter.IterUtil; import cn.hutool.core.collection.iter.IterUtil;
import cn.hutool.core.collection.iter.TransIter; import cn.hutool.core.collection.iter.TransIter;

View File

@ -22,6 +22,9 @@ import java.util.regex.Matcher;
*/ */
public class Ipv4Util { public class Ipv4Util {
/**
* 本地IP127.0.0.1
*/
public static final String LOCAL_IP = "127.0.0.1"; public static final String LOCAL_IP = "127.0.0.1";
/** /**
@ -162,9 +165,6 @@ public class Ipv4Util {
if (matcher.matches()) { if (matcher.matches()) {
return matchAddress(matcher); return matchAddress(matcher);
} }
// Validator.validateIpv4(strIP, "Invalid IPv4 address!");
// final long[] ip = Convert.convert(long[].class, StrUtil.split(strIP, CharUtil.DOT));
// return (ip[0] << 24) + (ip[1] << 16) + (ip[2] << 8) + ip[3];
throw new IllegalArgumentException("Invalid IPv4 address!"); throw new IllegalArgumentException("Invalid IPv4 address!");
} }

View File

@ -12,7 +12,7 @@ import java.util.concurrent.atomic.AtomicInteger;
* @since 4.0.3 * @since 4.0.3
* *
*/ */
public class LocalPortGenerater implements Serializable{ public class LocalPortGenerator implements Serializable{
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/** 备选的本地端口 */ /** 备选的本地端口 */
@ -23,7 +23,7 @@ public class LocalPortGenerater implements Serializable{
* *
* @param beginPort 起始端口号 * @param beginPort 起始端口号
*/ */
public LocalPortGenerater(final int beginPort) { public LocalPortGenerator(final int beginPort) {
alternativePort = new AtomicInteger(beginPort); alternativePort = new AtomicInteger(beginPort);
} }

View File

@ -1,4 +1,4 @@
package cn.hutool.core.net; package cn.hutool.core.net.ssl;
import javax.net.ssl.SSLEngine; import javax.net.ssl.SSLEngine;
import javax.net.ssl.X509ExtendedTrustManager; import javax.net.ssl.X509ExtendedTrustManager;

View File

@ -1,6 +1,6 @@
package cn.hutool.core.net; package cn.hutool.core.net.ssl;
import cn.hutool.core.builder.Builder; import cn.hutool.core.lang.builder.Builder;
import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.text.StrUtil; import cn.hutool.core.text.StrUtil;

View File

@ -1,4 +1,4 @@
package cn.hutool.core.net; package cn.hutool.core.net.ssl;
/** /**
* SSL或TLS协议 * SSL或TLS协议

View File

@ -1,4 +1,4 @@
package cn.hutool.core.net; package cn.hutool.core.net.ssl;
import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.io.IORuntimeException;

View File

@ -0,0 +1,6 @@
/**
* SSL相关封装
*
* @author looly
*/
package cn.hutool.core.net.ssl;

View File

@ -1,4 +1,4 @@
package cn.hutool.core.net; package cn.hutool.core.net.url;
import cn.hutool.core.codec.PercentCodec; import cn.hutool.core.codec.PercentCodec;

View File

@ -1,4 +1,4 @@
package cn.hutool.core.net; package cn.hutool.core.net.url;
import cn.hutool.core.codec.PercentCodec; import cn.hutool.core.codec.PercentCodec;

View File

@ -1,4 +1,4 @@
package cn.hutool.core.net; package cn.hutool.core.net.url;
import cn.hutool.core.util.CharUtil; import cn.hutool.core.util.CharUtil;
import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.CharsetUtil;

View File

@ -1,4 +1,4 @@
package cn.hutool.core.net; package cn.hutool.core.net.url;
import cn.hutool.core.exceptions.UtilException; import cn.hutool.core.exceptions.UtilException;
import cn.hutool.core.util.CharUtil; import cn.hutool.core.util.CharUtil;

View File

@ -1,4 +1,4 @@
package cn.hutool.core.net; package cn.hutool.core.net.url;
import cn.hutool.core.classloader.ClassLoaderUtil; import cn.hutool.core.classloader.ClassLoaderUtil;
import cn.hutool.core.exceptions.UtilException; import cn.hutool.core.exceptions.UtilException;
@ -7,7 +7,6 @@ import cn.hutool.core.io.IoUtil;
import cn.hutool.core.io.file.FileNameUtil; import cn.hutool.core.io.file.FileNameUtil;
import cn.hutool.core.io.resource.ResourceUtil; import cn.hutool.core.io.resource.ResourceUtil;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import cn.hutool.core.net.url.UrlQuery;
import cn.hutool.core.text.StrUtil; import cn.hutool.core.text.StrUtil;
import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.CharsetUtil;

View File

@ -1,11 +1,9 @@
package cn.hutool.core.net.url; package cn.hutool.core.net.url;
import cn.hutool.core.builder.Builder; import cn.hutool.core.lang.builder.Builder;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import cn.hutool.core.net.RFC3986;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.text.StrUtil; import cn.hutool.core.text.StrUtil;
import cn.hutool.core.net.URLUtil; import cn.hutool.core.util.CharsetUtil;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.URI; import java.net.URI;
@ -63,7 +61,7 @@ public final class UrlBuilder implements Builder<String> {
* 是否需要编码`%`<br> * 是否需要编码`%`<br>
* 区别对待如果是则生成URL时需要重新全部编码否则跳过所有`%` * 区别对待如果是则生成URL时需要重新全部编码否则跳过所有`%`
*/ */
private boolean needEncodePercent; private final boolean needEncodePercent;
/** /**
* 使用URI构建UrlBuilder * 使用URI构建UrlBuilder
@ -197,6 +195,8 @@ public final class UrlBuilder implements Builder<String> {
*/ */
public UrlBuilder() { public UrlBuilder() {
this.charset = CharsetUtil.UTF_8; this.charset = CharsetUtil.UTF_8;
// 编码非空情况下做解码
this.needEncodePercent = true;
} }
/** /**

View File

@ -3,8 +3,6 @@ package cn.hutool.core.net.url;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.ListUtil; import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import cn.hutool.core.net.RFC3986;
import cn.hutool.core.net.URLDecoder;
import cn.hutool.core.util.CharUtil; import cn.hutool.core.util.CharUtil;
import cn.hutool.core.text.StrUtil; import cn.hutool.core.text.StrUtil;
import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.ObjUtil;

View File

@ -6,9 +6,6 @@ import cn.hutool.core.collection.iter.IterUtil;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.hutool.core.map.TableMap; import cn.hutool.core.map.TableMap;
import cn.hutool.core.net.FormUrlencoded;
import cn.hutool.core.net.RFC3986;
import cn.hutool.core.net.URLDecoder;
import cn.hutool.core.text.StrUtil; import cn.hutool.core.text.StrUtil;
import java.nio.charset.Charset; import java.nio.charset.Charset;
@ -234,7 +231,7 @@ public class UrlQuery {
* @return URL查询字符串 * @return URL查询字符串
*/ */
public String build(final Charset charset) { public String build(final Charset charset) {
return build(charset, true); return build(charset, null != charset);
} }
/** /**

View File

@ -6,8 +6,8 @@ import cn.hutool.core.collection.iter.EnumerationIter;
import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.file.FileNameUtil; import cn.hutool.core.io.file.FileNameUtil;
import cn.hutool.core.io.resource.ResourceUtil; import cn.hutool.core.io.resource.ResourceUtil;
import cn.hutool.core.net.URLDecoder; import cn.hutool.core.net.url.URLDecoder;
import cn.hutool.core.net.URLUtil; import cn.hutool.core.net.url.URLUtil;
import cn.hutool.core.text.StrUtil; import cn.hutool.core.text.StrUtil;
import cn.hutool.core.util.CharUtil; import cn.hutool.core.util.CharUtil;
import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.CharsetUtil;

View File

@ -6,8 +6,8 @@ import cn.hutool.core.convert.BasicType;
import cn.hutool.core.exceptions.UtilException; import cn.hutool.core.exceptions.UtilException;
import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.resource.ResourceUtil; import cn.hutool.core.io.resource.ResourceUtil;
import cn.hutool.core.net.URLDecoder; import cn.hutool.core.net.url.URLDecoder;
import cn.hutool.core.net.URLUtil; import cn.hutool.core.net.url.URLUtil;
import cn.hutool.core.text.StrUtil; import cn.hutool.core.text.StrUtil;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.CharUtil; import cn.hutool.core.util.CharUtil;

View File

@ -268,7 +268,7 @@ public class EasyStream<T> extends AbstractEnhancedWrappedStream<T, EasyStream<T
* *
* @author VampireAchao * @author VampireAchao
*/ */
public interface Builder<T> extends Consumer<T>, cn.hutool.core.builder.Builder<EasyStream<T>> { public interface Builder<T> extends Consumer<T>, cn.hutool.core.lang.builder.Builder<EasyStream<T>> {
/** /**
* Adds an element to the unwrap being built. * Adds an element to the unwrap being built.

View File

@ -1,6 +1,6 @@
package cn.hutool.core.thread; package cn.hutool.core.thread;
import cn.hutool.core.builder.Builder; import cn.hutool.core.lang.builder.Builder;
import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.ObjUtil;
import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ArrayBlockingQueue;

View File

@ -1,6 +1,6 @@
package cn.hutool.core.thread; package cn.hutool.core.thread;
import cn.hutool.core.builder.Builder; import cn.hutool.core.lang.builder.Builder;
import cn.hutool.core.text.StrUtil; import cn.hutool.core.text.StrUtil;
import java.lang.Thread.UncaughtExceptionHandler; import java.lang.Thread.UncaughtExceptionHandler;

View File

@ -25,13 +25,16 @@ import java.util.function.Predicate;
* @author liangbaikai * @author liangbaikai
* @since 5.2.1 * @since 5.2.1
*/ */
public class Tree<T> extends LinkedHashMap<String, Object> implements Node<T> { public class MapTree<T> extends LinkedHashMap<String, Object> implements Node<T> {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private final TreeNodeConfig treeNodeConfig; private final TreeNodeConfig treeNodeConfig;
private Tree<T> parent; private MapTree<T> parent;
public Tree() { /**
* 构造
*/
public MapTree() {
this(null); this(null);
} }
@ -40,7 +43,7 @@ public class Tree<T> extends LinkedHashMap<String, Object> implements Node<T> {
* *
* @param treeNodeConfig TreeNode配置 * @param treeNodeConfig TreeNode配置
*/ */
public Tree(final TreeNodeConfig treeNodeConfig) { public MapTree(final TreeNodeConfig treeNodeConfig) {
this.treeNodeConfig = ObjUtil.defaultIfNull( this.treeNodeConfig = ObjUtil.defaultIfNull(
treeNodeConfig, TreeNodeConfig.DEFAULT_CONFIG); treeNodeConfig, TreeNodeConfig.DEFAULT_CONFIG);
} }
@ -61,7 +64,7 @@ public class Tree<T> extends LinkedHashMap<String, Object> implements Node<T> {
* @return 父节点 * @return 父节点
* @since 5.2.4 * @since 5.2.4
*/ */
public Tree<T> getParent() { public MapTree<T> getParent() {
return parent; return parent;
} }
@ -73,7 +76,7 @@ public class Tree<T> extends LinkedHashMap<String, Object> implements Node<T> {
* @return 节点 * @return 节点
* @since 5.2.4 * @since 5.2.4
*/ */
public Tree<T> getNode(final T id) { public MapTree<T> getNode(final T id) {
return TreeUtil.getNode(this, id); return TreeUtil.getNode(this, id);
} }
@ -115,7 +118,7 @@ public class Tree<T> extends LinkedHashMap<String, Object> implements Node<T> {
* @return this * @return this
* @since 5.2.4 * @since 5.2.4
*/ */
public Tree<T> setParent(final Tree<T> parent) { public MapTree<T> setParent(final MapTree<T> parent) {
this.parent = parent; this.parent = parent;
if (null != parent) { if (null != parent) {
this.setParentId(parent.getId()); this.setParentId(parent.getId());
@ -130,7 +133,7 @@ public class Tree<T> extends LinkedHashMap<String, Object> implements Node<T> {
} }
@Override @Override
public Tree<T> setId(final T id) { public MapTree<T> setId(final T id) {
this.put(treeNodeConfig.getIdKey(), id); this.put(treeNodeConfig.getIdKey(), id);
return this; return this;
} }
@ -142,7 +145,7 @@ public class Tree<T> extends LinkedHashMap<String, Object> implements Node<T> {
} }
@Override @Override
public Tree<T> setParentId(final T parentId) { public MapTree<T> setParentId(final T parentId) {
this.put(treeNodeConfig.getParentIdKey(), parentId); this.put(treeNodeConfig.getParentIdKey(), parentId);
return this; return this;
} }
@ -153,7 +156,7 @@ public class Tree<T> extends LinkedHashMap<String, Object> implements Node<T> {
} }
@Override @Override
public Tree<T> setName(final CharSequence name) { public MapTree<T> setName(final CharSequence name) {
this.put(treeNodeConfig.getNameKey(), name); this.put(treeNodeConfig.getNameKey(), name);
return this; return this;
} }
@ -164,7 +167,7 @@ public class Tree<T> extends LinkedHashMap<String, Object> implements Node<T> {
} }
@Override @Override
public Tree<T> setWeight(final Comparable<?> weight) { public MapTree<T> setWeight(final Comparable<?> weight) {
this.put(treeNodeConfig.getWeightKey(), weight); this.put(treeNodeConfig.getWeightKey(), weight);
return this; return this;
} }
@ -175,8 +178,8 @@ public class Tree<T> extends LinkedHashMap<String, Object> implements Node<T> {
* @return 所有子节点 * @return 所有子节点
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public List<Tree<T>> getChildren() { public List<MapTree<T>> getChildren() {
return (List<Tree<T>>) this.get(treeNodeConfig.getChildrenKey()); return (List<MapTree<T>>) this.get(treeNodeConfig.getChildrenKey());
} }
/** /**
@ -195,7 +198,7 @@ public class Tree<T> extends LinkedHashMap<String, Object> implements Node<T> {
* @param consumer 节点处理器 * @param consumer 节点处理器
* @since 5.7.16 * @since 5.7.16
*/ */
public void walk(final Consumer<Tree<T>> consumer) { public void walk(final Consumer<MapTree<T>> consumer) {
walk(consumer, false); walk(consumer, false);
} }
@ -206,27 +209,27 @@ public class Tree<T> extends LinkedHashMap<String, Object> implements Node<T> {
* @param broadFirst 是否广度优先遍历 * @param broadFirst 是否广度优先遍历
* @since 6.0.0 * @since 6.0.0
*/ */
public void walk(final Consumer<Tree<T>> consumer, final boolean broadFirst) { public void walk(final Consumer<MapTree<T>> consumer, final boolean broadFirst) {
if (broadFirst) { // 广度优先遍历 if (broadFirst) { // 广度优先遍历
// 加入FIFO队列 // 加入FIFO队列
final Queue<Tree<T>> queue = new LinkedList<>(); final Queue<MapTree<T>> queue = new LinkedList<>();
queue.offer(this); queue.offer(this);
while (false == queue.isEmpty()) { while (false == queue.isEmpty()) {
final Tree<T> node = queue.poll(); final MapTree<T> node = queue.poll();
consumer.accept(node); consumer.accept(node);
final List<Tree<T>> children = node.getChildren(); final List<MapTree<T>> children = node.getChildren();
if (CollUtil.isNotEmpty(children)) { if (CollUtil.isNotEmpty(children)) {
children.forEach(queue::offer); children.forEach(queue::offer);
} }
} }
} else { // 深度优先遍历 } else { // 深度优先遍历
// 入栈,FILO // 入栈,FILO
final Stack<Tree<T>> stack = new Stack<>(); final Stack<MapTree<T>> stack = new Stack<>();
stack.add(this); stack.add(this);
while (false == stack.isEmpty()) { while (false == stack.isEmpty()) {
final Tree<T> node = stack.pop(); final MapTree<T> node = stack.pop();
consumer.accept(node); consumer.accept(node);
final List<Tree<T>> children = node.getChildren(); final List<MapTree<T>> children = node.getChildren();
if (CollUtil.isNotEmpty(children)) { if (CollUtil.isNotEmpty(children)) {
children.forEach(stack::push); children.forEach(stack::push);
} }
@ -243,7 +246,7 @@ public class Tree<T> extends LinkedHashMap<String, Object> implements Node<T> {
* @see #filter(Predicate) * @see #filter(Predicate)
* @since 5.7.17 * @since 5.7.17
*/ */
public Tree<T> filterNew(final Predicate<Tree<T>> predicate) { public MapTree<T> filterNew(final Predicate<MapTree<T>> predicate) {
return cloneTree().filter(predicate); return cloneTree().filter(predicate);
} }
@ -256,18 +259,18 @@ public class Tree<T> extends LinkedHashMap<String, Object> implements Node<T> {
* @see #filterNew(Predicate) * @see #filterNew(Predicate)
* @since 5.7.17 * @since 5.7.17
*/ */
public Tree<T> filter(final Predicate<Tree<T>> predicate) { public MapTree<T> filter(final Predicate<MapTree<T>> predicate) {
if (null == predicate || predicate.test(this)) { if (null == predicate || predicate.test(this)) {
// 本节点满足则包括所有子节点都保留 // 本节点满足则包括所有子节点都保留
return this; return this;
} }
final List<Tree<T>> children = getChildren(); final List<MapTree<T>> children = getChildren();
if (CollUtil.isNotEmpty(children)) { if (CollUtil.isNotEmpty(children)) {
// 递归过滤子节点 // 递归过滤子节点
final List<Tree<T>> filteredChildren = new ArrayList<>(children.size()); final List<MapTree<T>> filteredChildren = new ArrayList<>(children.size());
Tree<T> filteredChild; MapTree<T> filteredChild;
for (final Tree<T> child : children) { for (final MapTree<T> child : children) {
filteredChild = child.filter(predicate); filteredChild = child.filter(predicate);
if (null != filteredChild) { if (null != filteredChild) {
filteredChildren.add(filteredChild); filteredChildren.add(filteredChild);
@ -291,7 +294,7 @@ public class Tree<T> extends LinkedHashMap<String, Object> implements Node<T> {
* @param children 子节点列表如果为{@code null}表示移除子节点 * @param children 子节点列表如果为{@code null}表示移除子节点
* @return this * @return this
*/ */
public Tree<T> setChildren(final List<Tree<T>> children) { public MapTree<T> setChildren(final List<MapTree<T>> children) {
if (null == children) { if (null == children) {
this.remove(treeNodeConfig.getChildrenKey()); this.remove(treeNodeConfig.getChildrenKey());
} }
@ -307,14 +310,14 @@ public class Tree<T> extends LinkedHashMap<String, Object> implements Node<T> {
* @since 5.6.7 * @since 5.6.7
*/ */
@SafeVarargs @SafeVarargs
public final Tree<T> addChildren(final Tree<T>... children) { public final MapTree<T> addChildren(final MapTree<T>... children) {
if (ArrayUtil.isNotEmpty(children)) { if (ArrayUtil.isNotEmpty(children)) {
List<Tree<T>> childrenList = this.getChildren(); List<MapTree<T>> childrenList = this.getChildren();
if (null == childrenList) { if (null == childrenList) {
childrenList = new ArrayList<>(); childrenList = new ArrayList<>();
setChildren(childrenList); setChildren(childrenList);
} }
for (final Tree<T> child : children) { for (final MapTree<T> child : children) {
child.setParent(this); child.setParent(this);
childrenList.add(child); childrenList.add(child);
} }
@ -347,8 +350,8 @@ public class Tree<T> extends LinkedHashMap<String, Object> implements Node<T> {
* @return 新的节点 * @return 新的节点
* @since 5.7.17 * @since 5.7.17
*/ */
public Tree<T> cloneTree() { public MapTree<T> cloneTree() {
final Tree<T> result = ObjUtil.clone(this); final MapTree<T> result = ObjUtil.clone(this);
result.setChildren(cloneChildren()); result.setChildren(cloneChildren());
return result; return result;
} }
@ -358,12 +361,12 @@ public class Tree<T> extends LinkedHashMap<String, Object> implements Node<T> {
* *
* @return 新的子节点列表 * @return 新的子节点列表
*/ */
private List<Tree<T>> cloneChildren() { private List<MapTree<T>> cloneChildren() {
final List<Tree<T>> children = getChildren(); final List<MapTree<T>> children = getChildren();
if (null == children) { if (null == children) {
return null; return null;
} }
final List<Tree<T>> newChildren = new ArrayList<>(children.size()); final List<MapTree<T>> newChildren = new ArrayList<>(children.size());
children.forEach((t) -> newChildren.add(t.cloneTree())); children.forEach((t) -> newChildren.add(t.cloneTree()));
return newChildren; return newChildren;
} }
@ -375,13 +378,13 @@ public class Tree<T> extends LinkedHashMap<String, Object> implements Node<T> {
* @param writer Writer * @param writer Writer
* @param intent 缩进量 * @param intent 缩进量
*/ */
private static void printTree(final Tree<?> tree, final PrintWriter writer, final int intent) { private static void printTree(final MapTree<?> tree, final PrintWriter writer, final int intent) {
writer.println(StrUtil.format("{}{}[{}]", StrUtil.repeat(CharUtil.SPACE, intent), tree.getName(), tree.getId())); writer.println(StrUtil.format("{}{}[{}]", StrUtil.repeat(CharUtil.SPACE, intent), tree.getName(), tree.getId()));
writer.flush(); writer.flush();
final List<? extends Tree<?>> children = tree.getChildren(); final List<? extends MapTree<?>> children = tree.getChildren();
if (CollUtil.isNotEmpty(children)) { if (CollUtil.isNotEmpty(children)) {
for (final Tree<?> child : children) { for (final MapTree<?> child : children) {
printTree(child, writer, intent + 2); printTree(child, writer, intent + 2);
} }
} }

View File

@ -1,6 +1,6 @@
package cn.hutool.core.tree; package cn.hutool.core.tree;
import cn.hutool.core.builder.Builder; import cn.hutool.core.lang.builder.Builder;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import cn.hutool.core.tree.parser.NodeParser; import cn.hutool.core.tree.parser.NodeParser;
@ -17,11 +17,11 @@ import java.util.Map;
* *
* @param <E> ID类型 * @param <E> ID类型
*/ */
public class TreeBuilder<E> implements Builder<Tree<E>> { public class TreeBuilder<E> implements Builder<MapTree<E>> {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private final Tree<E> root; private final MapTree<E> root;
private final Map<E, Tree<E>> idTreeMap; private final Map<E, MapTree<E>> idTreeMap;
private boolean isBuild; private boolean isBuild;
/** /**
@ -54,7 +54,7 @@ public class TreeBuilder<E> implements Builder<Tree<E>> {
* @param config 配置 * @param config 配置
*/ */
public TreeBuilder(final E rootId, final TreeNodeConfig config) { public TreeBuilder(final E rootId, final TreeNodeConfig config) {
root = new Tree<>(config); root = new MapTree<>(config);
root.setId(rootId); root.setId(rootId);
this.idTreeMap = new HashMap<>(); this.idTreeMap = new HashMap<>();
} }
@ -127,7 +127,7 @@ public class TreeBuilder<E> implements Builder<Tree<E>> {
* @param map 节点列表 * @param map 节点列表
* @return this * @return this
*/ */
public TreeBuilder<E> append(final Map<E, Tree<E>> map) { public TreeBuilder<E> append(final Map<E, MapTree<E>> map) {
checkBuilt(); checkBuilt();
this.idTreeMap.putAll(map); this.idTreeMap.putAll(map);
@ -140,10 +140,10 @@ public class TreeBuilder<E> implements Builder<Tree<E>> {
* @param trees 节点列表 * @param trees 节点列表
* @return this * @return this
*/ */
public TreeBuilder<E> append(final Iterable<Tree<E>> trees) { public TreeBuilder<E> append(final Iterable<MapTree<E>> trees) {
checkBuilt(); checkBuilt();
for (final Tree<E> tree : trees) { for (final MapTree<E> tree : trees) {
this.idTreeMap.put(tree.getId(), tree); this.idTreeMap.put(tree.getId(), tree);
} }
return this; return this;
@ -161,10 +161,10 @@ public class TreeBuilder<E> implements Builder<Tree<E>> {
checkBuilt(); checkBuilt();
final TreeNodeConfig config = this.root.getConfig(); final TreeNodeConfig config = this.root.getConfig();
final Map<E, Tree<E>> map = new LinkedHashMap<>(list.size(), 1); final Map<E, MapTree<E>> map = new LinkedHashMap<>(list.size(), 1);
Tree<E> node; MapTree<E> node;
for (final T t : list) { for (final T t : list) {
node = new Tree<>(config); node = new MapTree<>(config);
nodeParser.parse(t, node); nodeParser.parse(t, node);
map.put(node.getId(), node); map.put(node.getId(), node);
} }
@ -185,7 +185,7 @@ public class TreeBuilder<E> implements Builder<Tree<E>> {
} }
@Override @Override
public Tree<E> build() { public MapTree<E> build() {
checkBuilt(); checkBuilt();
buildFromMap(); buildFromMap();
@ -211,7 +211,7 @@ public class TreeBuilder<E> implements Builder<Tree<E>> {
* *
* @return 树列表 * @return 树列表
*/ */
public List<Tree<E>> buildList() { public List<MapTree<E>> buildList() {
if (isBuild) { if (isBuild) {
// 已经构建过了 // 已经构建过了
return this.root.getChildren(); return this.root.getChildren();
@ -227,9 +227,9 @@ public class TreeBuilder<E> implements Builder<Tree<E>> {
return; return;
} }
final Map<E, Tree<E>> eTreeMap = MapUtil.sortByValue(this.idTreeMap, false); final Map<E, MapTree<E>> eTreeMap = MapUtil.sortByValue(this.idTreeMap, false);
E parentId; E parentId;
for (final Tree<E> node : eTreeMap.values()) { for (final MapTree<E> node : eTreeMap.values()) {
if (null == node) { if (null == node) {
continue; continue;
} }
@ -239,7 +239,7 @@ public class TreeBuilder<E> implements Builder<Tree<E>> {
continue; continue;
} }
final Tree<E> parentNode = eTreeMap.get(parentId); final MapTree<E> parentNode = eTreeMap.get(parentId);
if (null != parentNode) { if (null != parentNode) {
parentNode.addChildren(node); parentNode.addChildren(node);
} }
@ -265,7 +265,7 @@ public class TreeBuilder<E> implements Builder<Tree<E>> {
* @param currentDepp 当前层级 * @param currentDepp 当前层级
* @param maxDeep 最大层级 * @param maxDeep 最大层级
*/ */
private void cutTree(final Tree<E> tree, final int currentDepp, final int maxDeep) { private void cutTree(final MapTree<E> tree, final int currentDepp, final int maxDeep) {
if (null == tree) { if (null == tree) {
return; return;
} }
@ -275,9 +275,9 @@ public class TreeBuilder<E> implements Builder<Tree<E>> {
return; return;
} }
final List<Tree<E>> children = tree.getChildren(); final List<MapTree<E>> children = tree.getChildren();
if (CollUtil.isNotEmpty(children)) { if (CollUtil.isNotEmpty(children)) {
for (final Tree<E> child : children) { for (final MapTree<E> child : children) {
cutTree(child, currentDepp + 1, maxDeep); cutTree(child, currentDepp + 1, maxDeep);
} }
} }

View File

@ -21,10 +21,10 @@ public class TreeUtil {
* 构建单root节点树 * 构建单root节点树
* *
* @param list 源数据集合 * @param list 源数据集合
* @return {@link Tree} * @return {@link MapTree}
* @since 5.7.2 * @since 5.7.2
*/ */
public static Tree<Integer> buildSingle(final List<TreeNode<Integer>> list) { public static MapTree<Integer> buildSingle(final List<TreeNode<Integer>> list) {
return buildSingle(list, 0); return buildSingle(list, 0);
} }
@ -34,7 +34,7 @@ public class TreeUtil {
* @param list 源数据集合 * @param list 源数据集合
* @return List * @return List
*/ */
public static List<Tree<Integer>> build(final List<TreeNode<Integer>> list) { public static List<MapTree<Integer>> build(final List<TreeNode<Integer>> list) {
return build(list, 0); return build(list, 0);
} }
@ -45,10 +45,10 @@ public class TreeUtil {
* @param <E> ID类型 * @param <E> ID类型
* @param list 源数据集合 * @param list 源数据集合
* @param parentId 最顶层父id值 一般为 0 之类 * @param parentId 最顶层父id值 一般为 0 之类
* @return {@link Tree} * @return {@link MapTree}
* @since 5.7.2 * @since 5.7.2
*/ */
public static <E> Tree<E> buildSingle(final List<TreeNode<E>> list, final E parentId) { public static <E> MapTree<E> buildSingle(final List<TreeNode<E>> list, final E parentId) {
return buildSingle(list, parentId, TreeNodeConfig.DEFAULT_CONFIG, new DefaultNodeParser<>()); return buildSingle(list, parentId, TreeNodeConfig.DEFAULT_CONFIG, new DefaultNodeParser<>());
} }
@ -60,7 +60,7 @@ public class TreeUtil {
* @param parentId 最顶层父id值 一般为 0 之类 * @param parentId 最顶层父id值 一般为 0 之类
* @return List * @return List
*/ */
public static <E> List<Tree<E>> build(final List<TreeNode<E>> list, final E parentId) { public static <E> List<MapTree<E>> build(final List<TreeNode<E>> list, final E parentId) {
return build(list, parentId, TreeNodeConfig.DEFAULT_CONFIG, new DefaultNodeParser<>()); return build(list, parentId, TreeNodeConfig.DEFAULT_CONFIG, new DefaultNodeParser<>());
} }
@ -73,10 +73,10 @@ public class TreeUtil {
* @param list 源数据集合 * @param list 源数据集合
* @param parentId 最顶层父id值 一般为 0 之类 * @param parentId 最顶层父id值 一般为 0 之类
* @param nodeParser 转换器 * @param nodeParser 转换器
* @return {@link Tree} * @return {@link MapTree}
* @since 5.7.2 * @since 5.7.2
*/ */
public static <T, E> Tree<E> buildSingle(final List<T> list, final E parentId, final NodeParser<T, E> nodeParser) { public static <T, E> MapTree<E> buildSingle(final List<T> list, final E parentId, final NodeParser<T, E> nodeParser) {
return buildSingle(list, parentId, TreeNodeConfig.DEFAULT_CONFIG, nodeParser); return buildSingle(list, parentId, TreeNodeConfig.DEFAULT_CONFIG, nodeParser);
} }
@ -90,7 +90,7 @@ public class TreeUtil {
* @param nodeParser 转换器 * @param nodeParser 转换器
* @return List * @return List
*/ */
public static <T, E> List<Tree<E>> build(final List<T> list, final E parentId, final NodeParser<T, E> nodeParser) { public static <T, E> List<MapTree<E>> build(final List<T> list, final E parentId, final NodeParser<T, E> nodeParser) {
return build(list, parentId, TreeNodeConfig.DEFAULT_CONFIG, nodeParser); return build(list, parentId, TreeNodeConfig.DEFAULT_CONFIG, nodeParser);
} }
@ -105,7 +105,7 @@ public class TreeUtil {
* @param nodeParser 转换器 * @param nodeParser 转换器
* @return List * @return List
*/ */
public static <T, E> List<Tree<E>> build(final List<T> list, final E rootId, final TreeNodeConfig treeNodeConfig, final NodeParser<T, E> nodeParser) { public static <T, E> List<MapTree<E>> build(final List<T> list, final E rootId, final TreeNodeConfig treeNodeConfig, final NodeParser<T, E> nodeParser) {
return buildSingle(list, rootId, treeNodeConfig, nodeParser).getChildren(); return buildSingle(list, rootId, treeNodeConfig, nodeParser).getChildren();
} }
@ -119,10 +119,10 @@ public class TreeUtil {
* @param rootId 最顶层父id值 一般为 0 之类 * @param rootId 最顶层父id值 一般为 0 之类
* @param treeNodeConfig 配置 * @param treeNodeConfig 配置
* @param nodeParser 转换器 * @param nodeParser 转换器
* @return {@link Tree} * @return {@link MapTree}
* @since 5.7.2 * @since 5.7.2
*/ */
public static <T, E> Tree<E> buildSingle(final List<T> list, final E rootId, final TreeNodeConfig treeNodeConfig, final NodeParser<T, E> nodeParser) { public static <T, E> MapTree<E> buildSingle(final List<T> list, final E rootId, final TreeNodeConfig treeNodeConfig, final NodeParser<T, E> nodeParser) {
return TreeBuilder.of(rootId, treeNodeConfig) return TreeBuilder.of(rootId, treeNodeConfig)
.append(list, nodeParser).build(); .append(list, nodeParser).build();
} }
@ -136,7 +136,7 @@ public class TreeUtil {
* @return List * @return List
* @since 5.6.7 * @since 5.6.7
*/ */
public static <E> List<Tree<E>> build(final Map<E, Tree<E>> map, final E rootId) { public static <E> List<MapTree<E>> build(final Map<E, MapTree<E>> map, final E rootId) {
return buildSingle(map, rootId).getChildren(); return buildSingle(map, rootId).getChildren();
} }
@ -147,11 +147,11 @@ public class TreeUtil {
* @param <E> ID类型 * @param <E> ID类型
* @param map 源数据Map * @param map 源数据Map
* @param rootId 根节点id值 一般为 0 之类 * @param rootId 根节点id值 一般为 0 之类
* @return {@link Tree} * @return {@link MapTree}
* @since 5.7.2 * @since 5.7.2
*/ */
public static <E> Tree<E> buildSingle(final Map<E, Tree<E>> map, final E rootId) { public static <E> MapTree<E> buildSingle(final Map<E, MapTree<E>> map, final E rootId) {
final Tree<E> tree = CollUtil.getFirstNoneNull(map.values()); final MapTree<E> tree = CollUtil.getFirstNoneNull(map.values());
if (null != tree) { if (null != tree) {
final TreeNodeConfig config = tree.getConfig(); final TreeNodeConfig config = tree.getConfig();
return TreeBuilder.of(rootId, config) return TreeBuilder.of(rootId, config)
@ -172,19 +172,19 @@ public class TreeUtil {
* @return 节点 * @return 节点
* @since 5.2.4 * @since 5.2.4
*/ */
public static <T> Tree<T> getNode(final Tree<T> node, final T id) { public static <T> MapTree<T> getNode(final MapTree<T> node, final T id) {
if (ObjUtil.equals(id, node.getId())) { if (ObjUtil.equals(id, node.getId())) {
return node; return node;
} }
final List<Tree<T>> children = node.getChildren(); final List<MapTree<T>> children = node.getChildren();
if (null == children) { if (null == children) {
return null; return null;
} }
// 查找子节点 // 查找子节点
Tree<T> childNode; MapTree<T> childNode;
for (final Tree<T> child : children) { for (final MapTree<T> child : children) {
childNode = child.getNode(id); childNode = child.getNode(id);
if (null != childNode) { if (null != childNode) {
return childNode; return childNode;
@ -208,7 +208,7 @@ public class TreeUtil {
* @return 所有父节点名称列表node为null返回空List * @return 所有父节点名称列表node为null返回空List
* @since 5.2.4 * @since 5.2.4
*/ */
public static <T> List<CharSequence> getParentsName(final Tree<T> node, final boolean includeCurrentNode) { public static <T> List<CharSequence> getParentsName(final MapTree<T> node, final boolean includeCurrentNode) {
final List<CharSequence> result = new ArrayList<>(); final List<CharSequence> result = new ArrayList<>();
if (null == node) { if (null == node) {
return result; return result;
@ -218,7 +218,7 @@ public class TreeUtil {
result.add(node.getName()); result.add(node.getName());
} }
Tree<T> parent = node.getParent(); MapTree<T> parent = node.getParent();
while (null != parent) { while (null != parent) {
result.add(parent.getName()); result.add(parent.getName());
parent = parent.getParent(); parent = parent.getParent();
@ -231,11 +231,11 @@ public class TreeUtil {
* *
* @param id 节点ID * @param id 节点ID
* @param <E> 节点ID类型 * @param <E> 节点ID类型
* @return {@link Tree} * @return {@link MapTree}
* @since 5.7.2 * @since 5.7.2
*/ */
public static <E> Tree<E> createEmptyNode(final E id) { public static <E> MapTree<E> createEmptyNode(final E id) {
return new Tree<E>().setId(id); return new MapTree<E>().setId(id);
} }
/** /**
@ -246,11 +246,11 @@ public class TreeUtil {
* @param <E> 节点ID类型 * @param <E> 节点ID类型
* @return 树所有节点列表 * @return 树所有节点列表
*/ */
public static <E> List<Tree<E>> toList(final Tree<E> root, final boolean broadFirst) { public static <E> List<MapTree<E>> toList(final MapTree<E> root, final boolean broadFirst) {
if (Objects.isNull(root)) { if (Objects.isNull(root)) {
return null; return null;
} }
final List<Tree<E>> list = new ArrayList<>(); final List<MapTree<E>> list = new ArrayList<>();
root.walk(list::add, broadFirst); root.walk(list::add, broadFirst);
return list; return list;

View File

@ -1,7 +1,7 @@
package cn.hutool.core.tree.parser; package cn.hutool.core.tree.parser;
import cn.hutool.core.tree.TreeNode; import cn.hutool.core.tree.TreeNode;
import cn.hutool.core.tree.Tree; import cn.hutool.core.tree.MapTree;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import java.util.Map; import java.util.Map;
@ -15,7 +15,7 @@ import java.util.Map;
public class DefaultNodeParser<T> implements NodeParser<TreeNode<T>, T> { public class DefaultNodeParser<T> implements NodeParser<TreeNode<T>, T> {
@Override @Override
public void parse(final TreeNode<T> treeNode, final Tree<T> tree) { public void parse(final TreeNode<T> treeNode, final MapTree<T> tree) {
tree.setId(treeNode.getId()); tree.setId(treeNode.getId());
tree.setParentId(treeNode.getParentId()); tree.setParentId(treeNode.getParentId());
tree.setWeight(treeNode.getWeight()); tree.setWeight(treeNode.getWeight());

View File

@ -1,6 +1,6 @@
package cn.hutool.core.tree.parser; package cn.hutool.core.tree.parser;
import cn.hutool.core.tree.Tree; import cn.hutool.core.tree.MapTree;
/** /**
* 树节点解析器 可以参考{@link DefaultNodeParser} * 树节点解析器 可以参考{@link DefaultNodeParser}
@ -14,6 +14,6 @@ public interface NodeParser<T, E> {
* @param object 源数据实体 * @param object 源数据实体
* @param treeNode 树节点实体 * @param treeNode 树节点实体
*/ */
void parse(T object, Tree<E> treeNode); void parse(T object, MapTree<E> treeNode);
} }

View File

@ -29,6 +29,9 @@ import java.util.concurrent.atomic.LongAdder;
*/ */
public class ByteUtil { public class ByteUtil {
/**
* 默认字节序大端在前小端在后
*/
public static final ByteOrder DEFAULT_ORDER = ByteOrder.LITTLE_ENDIAN; public static final ByteOrder DEFAULT_ORDER = ByteOrder.LITTLE_ENDIAN;
/** /**
* CPU的字节序 * CPU的字节序

View File

@ -25,6 +25,9 @@ import java.util.regex.Pattern;
*/ */
public class CreditCodeUtil { public class CreditCodeUtil {
/**
* 统一社会信用代码正则
*/
public static final Pattern CREDIT_CODE_PATTERN = PatternPool.CREDIT_CODE; public static final Pattern CREDIT_CODE_PATTERN = PatternPool.CREDIT_CODE;
/** /**

View File

@ -174,7 +174,7 @@ public class PageUtil {
* @param pageSize 每页数 * @param pageSize 每页数
* @return 总页数 * @return 总页数
*/ */
public static int totalPage(int totalCount, int pageSize) { public static int totalPage(final int totalCount, final int pageSize) {
return totalPage((long) totalCount, pageSize); return totalPage((long) totalCount, pageSize);
} }
@ -186,7 +186,7 @@ public class PageUtil {
* @return 总页数 * @return 总页数
* @since 5.8.5 * @since 5.8.5
*/ */
public static int totalPage(long totalCount, int pageSize) { public static int totalPage(final long totalCount, final int pageSize) {
if (pageSize == 0) { if (pageSize == 0) {
return 0; return 0;
} }

View File

@ -1487,7 +1487,6 @@ public class XmlUtil {
*/ */
private void examineNode(final Node node, final boolean attributesOnly) { private void examineNode(final Node node, final boolean attributesOnly) {
final NamedNodeMap attributes = node.getAttributes(); final NamedNodeMap attributes = node.getAttributes();
//noinspection ConstantConditions
if (null != attributes) { if (null != attributes) {
final int length = attributes.getLength(); final int length = attributes.getLength();
for (int i = 0; i < length; i++) { for (int i = 0; i < length; i++) {

View File

@ -1,5 +1,6 @@
package cn.hutool.core.builder; package cn.hutool.core.builder;
import cn.hutool.core.lang.builder.GenericBuilder;
import cn.hutool.core.text.StrUtil; import cn.hutool.core.text.StrUtil;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;

View File

@ -1,6 +1,6 @@
package cn.hutool.core.lang; package cn.hutool.core.lang;
import cn.hutool.core.builder.GenericBuilder; import cn.hutool.core.lang.builder.GenericBuilder;
import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateTime;
import cn.hutool.core.map.Dict; import cn.hutool.core.map.Dict;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;

View File

@ -1,5 +1,6 @@
package cn.hutool.core.net; package cn.hutool.core.net;
import cn.hutool.core.net.url.FormUrlencoded;
import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.CharsetUtil;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;

View File

@ -1,5 +1,6 @@
package cn.hutool.core.net; package cn.hutool.core.net;
import cn.hutool.core.net.url.RFC3986;
import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.CharsetUtil;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;

View File

@ -1,5 +1,7 @@
package cn.hutool.core.net; package cn.hutool.core.net;
import cn.hutool.core.net.url.URLDecoder;
import cn.hutool.core.net.url.URLEncoder;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;

View File

@ -1,5 +1,6 @@
package cn.hutool.core.net; package cn.hutool.core.net;
import cn.hutool.core.net.url.URLUtil;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;

View File

@ -1,5 +1,6 @@
package cn.hutool.core.net; package cn.hutool.core.net;
import cn.hutool.core.net.url.URLDecoder;
import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.CharsetUtil;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;

View File

@ -1,6 +1,7 @@
package cn.hutool.core.net; package cn.hutool.core.net;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.hutool.core.net.url.URLUtil;
import cn.hutool.core.net.url.UrlBuilder; import cn.hutool.core.net.url.UrlBuilder;
import cn.hutool.core.net.url.UrlQuery; import cn.hutool.core.net.url.UrlQuery;
import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.CharsetUtil;

View File

@ -19,7 +19,7 @@ public class Issue2279Test {
new TestTree(4, 2, 4, 4) new TestTree(4, 2, 4, 4)
); );
final List<Tree<String>> stringTree = TreeUtil.build(list, "0", final List<MapTree<String>> stringTree = TreeUtil.build(list, "0",
(object, treeNode) -> { (object, treeNode) -> {
treeNode.setId(object.getId()); treeNode.setId(object.getId());
treeNode.setName(object.getName()); treeNode.setName(object.getName());
@ -28,7 +28,7 @@ public class Issue2279Test {
} }
); );
final Tree<String> result = stringTree.get(0); final MapTree<String> result = stringTree.get(0);
Assert.assertEquals(2, result.getChildren().size()); Assert.assertEquals(2, result.getChildren().size());
} }

View File

@ -1,8 +1,5 @@
package cn.hutool.core.tree; package cn.hutool.core.tree;
import cn.hutool.core.tree.Tree;
import cn.hutool.core.tree.TreeNode;
import cn.hutool.core.tree.TreeUtil;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
@ -30,10 +27,10 @@ public class TreeSearchTest {
@Test @Test
public void searchNode() { public void searchNode() {
final List<Tree<Long>> treeItems= TreeUtil.build(all_menu, 0L); final List<MapTree<Long>> treeItems= TreeUtil.build(all_menu, 0L);
final Tree<Long> tree=treeItems.get(0); final MapTree<Long> tree=treeItems.get(0);
final Tree<Long> searchResult=tree.getNode(3L); final MapTree<Long> searchResult=tree.getNode(3L);
Assert.assertEquals("module-B", searchResult.getName()); Assert.assertEquals("module-B", searchResult.getName());
} }

View File

@ -31,16 +31,16 @@ public class TreeTest {
@Test @Test
public void sampleTreeTest() { public void sampleTreeTest() {
final List<Tree<String>> treeList = TreeUtil.build(nodeList, "0"); final List<MapTree<String>> treeList = TreeUtil.build(nodeList, "0");
for (final Tree<String> tree : treeList) { for (final MapTree<String> tree : treeList) {
Assert.assertNotNull(tree); Assert.assertNotNull(tree);
Assert.assertEquals("0", tree.getParentId()); Assert.assertEquals("0", tree.getParentId());
// Console.log(tree); // Console.log(tree);
} }
// 测试通过子节点查找父节点 // 测试通过子节点查找父节点
final Tree<String> rootNode0 = treeList.get(0); final MapTree<String> rootNode0 = treeList.get(0);
final Tree<String> parent = rootNode0.getChildren().get(0).getParent(); final MapTree<String> parent = rootNode0.getChildren().get(0).getParent();
Assert.assertEquals(rootNode0, parent); Assert.assertEquals(rootNode0, parent);
} }
@ -55,7 +55,7 @@ public class TreeTest {
treeNodeConfig.setDeep(2); treeNodeConfig.setDeep(2);
//转换器 //转换器
final List<Tree<String>> treeNodes = TreeUtil.build(nodeList, "0", treeNodeConfig, final List<MapTree<String>> treeNodes = TreeUtil.build(nodeList, "0", treeNodeConfig,
(treeNode, tree) -> { (treeNode, tree) -> {
tree.setId(treeNode.getId()); tree.setId(treeNode.getId());
tree.setParentId(treeNode.getParentId()); tree.setParentId(treeNode.getParentId());
@ -72,7 +72,7 @@ public class TreeTest {
@Test @Test
public void walkTest(){ public void walkTest(){
final List<String> ids = new ArrayList<>(); final List<String> ids = new ArrayList<>();
final Tree<String> tree = TreeUtil.buildSingle(nodeList, "0"); final MapTree<String> tree = TreeUtil.buildSingle(nodeList, "0");
tree.walk((tr)-> ids.add(tr.getId())); tree.walk((tr)-> ids.add(tr.getId()));
Assert .assertEquals(7, ids.size()); Assert .assertEquals(7, ids.size());
@ -81,7 +81,7 @@ public class TreeTest {
@Test @Test
public void walkBroadFirstTest(){ public void walkBroadFirstTest(){
final List<String> ids = new ArrayList<>(); final List<String> ids = new ArrayList<>();
final Tree<String> tree = TreeUtil.buildSingle(nodeList, "0"); final MapTree<String> tree = TreeUtil.buildSingle(nodeList, "0");
Console.log(tree); Console.log(tree);
tree.walk((tr)-> ids.add(tr.getId()), true); tree.walk((tr)-> ids.add(tr.getId()), true);
@ -91,8 +91,8 @@ public class TreeTest {
@Test @Test
public void cloneTreeTest(){ public void cloneTreeTest(){
final Tree<String> tree = TreeUtil.buildSingle(nodeList, "0"); final MapTree<String> tree = TreeUtil.buildSingle(nodeList, "0");
final Tree<String> cloneTree = tree.cloneTree(); final MapTree<String> cloneTree = tree.cloneTree();
final List<String> ids = new ArrayList<>(); final List<String> ids = new ArrayList<>();
cloneTree.walk((tr)-> ids.add(tr.getId())); cloneTree.walk((tr)-> ids.add(tr.getId()));
@ -103,7 +103,7 @@ public class TreeTest {
@Test @Test
public void filterTest(){ public void filterTest(){
// 经过过滤丢掉"用户添加"节点 // 经过过滤丢掉"用户添加"节点
final Tree<String> tree = TreeUtil.buildSingle(nodeList, "0"); final MapTree<String> tree = TreeUtil.buildSingle(nodeList, "0");
tree.filter((t)->{ tree.filter((t)->{
final CharSequence name = t.getName(); final CharSequence name = t.getName();
return null != name && name.toString().contains("店铺"); return null != name && name.toString().contains("店铺");
@ -116,10 +116,10 @@ public class TreeTest {
@Test @Test
public void filterNewTest(){ public void filterNewTest(){
final Tree<String> tree = TreeUtil.buildSingle(nodeList, "0"); final MapTree<String> tree = TreeUtil.buildSingle(nodeList, "0");
// 经过过滤生成新的树 // 经过过滤生成新的树
final Tree<String> newTree = tree.filterNew((t)->{ final MapTree<String> newTree = tree.filterNew((t)->{
final CharSequence name = t.getName(); final CharSequence name = t.getName();
return null != name && name.toString().contains("店铺"); return null != name && name.toString().contains("店铺");
}); });

View File

@ -1,6 +1,6 @@
package cn.hutool.cron.pattern; package cn.hutool.cron.pattern;
import cn.hutool.core.builder.Builder; import cn.hutool.core.lang.builder.Builder;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import cn.hutool.core.text.StrJoiner; import cn.hutool.core.text.StrJoiner;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;

View File

@ -1,6 +1,6 @@
package cn.hutool.db.sql; package cn.hutool.db.sql;
import cn.hutool.core.builder.Builder; import cn.hutool.core.lang.builder.Builder;
import cn.hutool.core.collection.ListUtil; import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.CharUtil; import cn.hutool.core.util.CharUtil;

View File

@ -1,6 +1,6 @@
package cn.hutool.db.sql; package cn.hutool.db.sql;
import cn.hutool.core.builder.Builder; import cn.hutool.core.lang.builder.Builder;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.text.StrUtil; import cn.hutool.core.text.StrUtil;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;

View File

@ -1,6 +1,6 @@
package cn.hutool.extra.mail; package cn.hutool.extra.mail;
import cn.hutool.core.builder.Builder; import cn.hutool.core.lang.builder.Builder;
import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil; import cn.hutool.core.io.IoUtil;

View File

@ -11,7 +11,7 @@ import cn.hutool.core.io.IoUtil;
import cn.hutool.core.map.CaseInsensitiveMap; import cn.hutool.core.map.CaseInsensitiveMap;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.hutool.core.net.NetUtil; import cn.hutool.core.net.NetUtil;
import cn.hutool.core.net.URLEncoder; import cn.hutool.core.net.url.URLEncoder;
import cn.hutool.core.net.multipart.MultipartFormData; import cn.hutool.core.net.multipart.MultipartFormData;
import cn.hutool.core.net.multipart.UploadSetting; import cn.hutool.core.net.multipart.UploadSetting;
import cn.hutool.core.reflect.ConstructorUtil; import cn.hutool.core.reflect.ConstructorUtil;

View File

@ -11,7 +11,7 @@ import cn.hutool.core.io.IoUtil;
import cn.hutool.core.map.CaseInsensitiveMap; import cn.hutool.core.map.CaseInsensitiveMap;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.hutool.core.net.NetUtil; import cn.hutool.core.net.NetUtil;
import cn.hutool.core.net.URLEncoder; import cn.hutool.core.net.url.URLEncoder;
import cn.hutool.core.net.multipart.MultipartFormData; import cn.hutool.core.net.multipart.MultipartFormData;
import cn.hutool.core.net.multipart.UploadSetting; import cn.hutool.core.net.multipart.UploadSetting;
import cn.hutool.core.reflect.ConstructorUtil; import cn.hutool.core.reflect.ConstructorUtil;

View File

@ -3,7 +3,7 @@ package cn.hutool.extra.ssh;
import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil; import cn.hutool.core.io.IoUtil;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import cn.hutool.core.net.LocalPortGenerater; import cn.hutool.core.net.LocalPortGenerator;
import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.text.StrUtil; import cn.hutool.core.text.StrUtil;
import com.jcraft.jsch.*; import com.jcraft.jsch.*;
@ -31,7 +31,7 @@ public class JschUtil {
/** /**
* 本地端口生成器 * 本地端口生成器
*/ */
private static final LocalPortGenerater portGenerater = new LocalPortGenerater(10000); private static final LocalPortGenerator portGenerater = new LocalPortGenerator(10000);
/** /**
* 生成一个本地端口用于远程端口映射 * 生成一个本地端口用于远程端口映射

View File

@ -1,7 +1,7 @@
package cn.hutool.http; package cn.hutool.http;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import cn.hutool.core.net.SSLUtil; import cn.hutool.core.net.ssl.SSLUtil;
import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.SSLSocketFactory;

View File

@ -1,7 +1,7 @@
package cn.hutool.http; package cn.hutool.http;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.hutool.core.net.URLUtil; import cn.hutool.core.net.url.URLUtil;
import cn.hutool.core.reflect.FieldUtil; import cn.hutool.core.reflect.FieldUtil;
import cn.hutool.core.text.StrUtil; import cn.hutool.core.text.StrUtil;
import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.ObjUtil;

View File

@ -10,12 +10,12 @@ import cn.hutool.core.io.resource.Resource;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.hutool.core.map.TableMap; import cn.hutool.core.map.TableMap;
import cn.hutool.core.net.SSLUtil; import cn.hutool.core.net.ssl.SSLUtil;
import cn.hutool.core.net.url.UrlBuilder; import cn.hutool.core.net.url.UrlBuilder;
import cn.hutool.core.net.url.UrlQuery; import cn.hutool.core.net.url.UrlQuery;
import cn.hutool.core.text.StrUtil;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.text.StrUtil;
import cn.hutool.http.body.BytesBody; import cn.hutool.http.body.BytesBody;
import cn.hutool.http.body.FormUrlEncodedBody; import cn.hutool.http.body.FormUrlEncodedBody;
import cn.hutool.http.body.MultipartBody; import cn.hutool.http.body.MultipartBody;

View File

@ -7,7 +7,7 @@ import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil; import cn.hutool.core.io.IoUtil;
import cn.hutool.core.io.StreamProgress; import cn.hutool.core.io.StreamProgress;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import cn.hutool.core.net.URLEncoder; import cn.hutool.core.net.url.URLEncoder;
import cn.hutool.core.regex.ReUtil; import cn.hutool.core.regex.ReUtil;
import cn.hutool.core.text.StrUtil; import cn.hutool.core.text.StrUtil;
import cn.hutool.http.cookie.GlobalCookieManager; import cn.hutool.http.cookie.GlobalCookieManager;

View File

@ -6,8 +6,8 @@ import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil; import cn.hutool.core.io.IoUtil;
import cn.hutool.core.io.StreamProgress; import cn.hutool.core.io.StreamProgress;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.hutool.core.net.RFC3986; import cn.hutool.core.net.url.RFC3986;
import cn.hutool.core.net.URLEncoder; import cn.hutool.core.net.url.URLEncoder;
import cn.hutool.core.net.url.UrlQuery; import cn.hutool.core.net.url.UrlQuery;
import cn.hutool.core.regex.ReUtil; import cn.hutool.core.regex.ReUtil;
import cn.hutool.core.text.StrUtil; import cn.hutool.core.text.StrUtil;

View File

@ -2,7 +2,7 @@ package cn.hutool.http.cookie;
import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.hutool.core.net.URLUtil; import cn.hutool.core.net.url.URLUtil;
import cn.hutool.http.HttpConnection; import cn.hutool.http.HttpConnection;
import java.io.IOException; import java.io.IOException;

View File

@ -3,7 +3,7 @@ package cn.hutool.http.server;
import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil; import cn.hutool.core.io.IoUtil;
import cn.hutool.core.net.URLEncoder; import cn.hutool.core.net.url.URLEncoder;
import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.text.StrUtil; import cn.hutool.core.text.StrUtil;
import cn.hutool.http.ContentType; import cn.hutool.http.ContentType;

View File

@ -1,7 +1,7 @@
package cn.hutool.http.ssl; package cn.hutool.http.ssl;
import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.net.SSLProtocols; import cn.hutool.core.net.ssl.SSLProtocols;
/** /**
* 兼容android低版本SSL连接<br> * 兼容android低版本SSL连接<br>

View File

@ -1,7 +1,7 @@
package cn.hutool.http.ssl; package cn.hutool.http.ssl;
import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.net.SSLUtil; import cn.hutool.core.net.ssl.SSLUtil;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;
import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocket;

View File

@ -3,7 +3,7 @@ package cn.hutool.http;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.StopWatch; import cn.hutool.core.date.StopWatch;
import cn.hutool.core.lang.Console; import cn.hutool.core.lang.Console;
import cn.hutool.core.net.SSLProtocols; import cn.hutool.core.net.ssl.SSLProtocols;
import cn.hutool.core.net.url.UrlBuilder; import cn.hutool.core.net.url.UrlBuilder;
import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.CharsetUtil;
import org.junit.Ignore; import org.junit.Ignore;

View File

@ -0,0 +1,13 @@
package cn.hutool.http;
import cn.hutool.core.net.url.UrlBuilder;
import org.junit.Assert;
import org.junit.Test;
public class IssueI5TFPUTest {
@Test
public void urlBuilderTest() {
final UrlBuilder urlBuilder = UrlBuilder.of("https://hutool.cn", null).addQuery("opt", "%");
Assert.assertEquals("https://hutool.cn?opt=%", urlBuilder.toString());
}
}

View File

@ -178,7 +178,7 @@ public interface JSON extends Converter, Cloneable, Serializable {
} }
@Override @Override
default Object convert(Type targetType, Object value) throws ConvertException { default Object convert(final Type targetType, final Object value) throws ConvertException {
return JSONConverter.of(getConfig()).convert(targetType, value); return JSONConverter.of(getConfig()).convert(targetType, value);
} }
} }

View File

@ -6,9 +6,9 @@
* </ul> * </ul>
* JSON封装主要包括JSON表示和JSON转换 * JSON封装主要包括JSON表示和JSON转换
* *
* <pre> * <pre>{@code
* Java对象 &lt;----&gt; JSON对象 &lt;----&gt; JSON字符串 * Java对象 <----> JSON对象 <----> JSON字符串
* </pre> * }</pre>
* *
* *
* @author looly * @author looly

View File

@ -13,7 +13,7 @@ import cn.hutool.core.map.SafeConcurrentHashMap;
import cn.hutool.core.map.TableMap; import cn.hutool.core.map.TableMap;
import cn.hutool.core.map.multi.RowKeyTable; import cn.hutool.core.map.multi.RowKeyTable;
import cn.hutool.core.map.multi.Table; import cn.hutool.core.map.multi.Table;
import cn.hutool.core.net.URLEncoder; import cn.hutool.core.net.url.URLEncoder;
import cn.hutool.core.text.StrUtil; import cn.hutool.core.text.StrUtil;
import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.CharsetUtil;
import cn.hutool.poi.excel.cell.CellLocation; import cn.hutool.poi.excel.cell.CellLocation;

View File

@ -3,7 +3,7 @@ package cn.hutool.setting;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.ListUtil; import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.io.IoUtil; import cn.hutool.core.io.IoUtil;
import cn.hutool.core.net.URLUtil; import cn.hutool.core.net.url.URLUtil;
import cn.hutool.core.text.StrUtil; import cn.hutool.core.text.StrUtil;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.CharsetUtil;