diff --git a/CHANGELOG.md b/CHANGELOG.md
index 983da7d72..0ca3fa474 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,17 +3,33 @@
-------------------------------------------------------------------------------------------------------------
-# 5.5.0 (2020-11-09)
+# 5.5.1 (2020-11-15)
+
+### 新特性
+### Bug修复
+* 【core 】 修复在Linux下FileUtil.move失败问题(issue#I254Y3@Gitee)
+
+-------------------------------------------------------------------------------------------------------------
+
+# 5.5.0 (2020-11-14)
+
+### 大版本特性
+* 【extra 】 增加jakarta.validation-api封装:ValidationUtil(pr#207@Gitee)
+* 【extra 】 增加表达式引擎封装:ExpressionUtil(pr#1203@Github)
+* 【extra 】 新增基于Apache-FtpServer封装:SimpleFtpServer
+* 【extra 】 新增基于Commons-Compress封装:CompressUtil
### 新特性
* 【core 】 NumberUtil.parseInt等支持123,2.00这类数字(issue#I23ORQ@Gitee)
* 【core 】 增加ArrayUtil.isSub、indexOfSub、lastIndexOfSub方法(issue#I23O1K@Gitee)
-* 【extra 】 增加ValidationUtil(pr#207@Gitee)
* 【core 】 反射调用支持传递参数的值为null(pr#1205@Github)
* 【core 】 HexUtil增加format方法(issue#I245NF@Gitee)
* 【poi 】 ExcelWriter增加setCurrentRowToEnd方法(issue#I24A2R@Gitee)
* 【core 】 ExcelWriter增加setCurrentRowToEnd方法(issue#I24A2R@Gitee)
-* 【extra 】 增加表达式引擎封装(ExpressionUtil)(pr#1203@Github)
+* 【core 】 增加enum转数字支持(issue#I24QZY@Gitee)
+* 【core 】 NumberUtil.toBigDecimal空白符转换为0(issue#I24MRP@Gitee)
+* 【core 】 CollUtil和IterUtil增加size方法(pr#208@Gitee)
+* 【poi 】 ExcelReader的read方法读取空单元格增加CellEditor处理(issue#1213@Github)
### Bug修复
* 【core 】 修复DateUtil.current使用System.nanoTime的问题(issue#1198@Github)
@@ -24,6 +40,9 @@
* 【poi 】 修复Excel07SaxReader读取公式的错误的问题(issue#I23VFL@Gitee)
* 【http 】 修复HttpUtil.isHttp判断问题(pr#1208@Github)
* 【http 】 修复Snowflake时间回拨导致ID重复的bug(issue#1206@Github)
+* 【core 】 修复StrUtil.lastIndexOf查找位于首位的字符串找不到的bug(issue#I24RSV@Gitee)
+* 【poi 】 修复BigExcelWriter的autoSizeColumnAll问题(pr#1221@Github)
+* 【core 】 修复StrUtil.subBetweenAll不支持相同字符的问题(pr#1217@Github)
-------------------------------------------------------------------------------------------------------------
diff --git a/README-EN.md b/README-EN.md
index 518d10262..0f1c0da29 100644
--- a/README-EN.md
+++ b/README-EN.md
@@ -45,6 +45,11 @@
+
+-------------------------------------------------------------------------------
+
+[**中文说明**](README.md)
+
-------------------------------------------------------------------------------
## Introduction
@@ -120,19 +125,19 @@ Each module can be introduced individually, or all modules can be introduced by
cn.hutool
hutool-all
- 5.4.8
+ 5.5.1
```
### Gradle
```
-compile 'cn.hutool:hutool-all:5.4.8'
+compile 'cn.hutool:hutool-all:5.5.1'
```
## Download
-- [Maven1](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.4.8/)
-- [Maven2](http://repo2.maven.org/maven2/cn/hutool/hutool-all/5.4.8/)
+- [Maven1](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.5.1/)
+- [Maven2](http://repo2.maven.org/maven2/cn/hutool/hutool-all/5.5.1/)
> note:
> Hutool 5.x supports JDK8+ and is not tested on Android platforms, and cannot guarantee that all tool classes or tool methods are available.
diff --git a/README.md b/README.md
index 7c9f42d41..04316f385 100644
--- a/README.md
+++ b/README.md
@@ -48,6 +48,10 @@
-------------------------------------------------------------------------------
+[**English Documentation**](README-EN.md)
+
+-------------------------------------------------------------------------------
+
## 简介
Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。
@@ -119,21 +123,21 @@ Hutool的存在就是为了减少代码搜索成本,避免网络上参差不
cn.hutool
hutool-all
- 5.4.8
+ 5.5.1
```
### Gradle
```
-compile 'cn.hutool:hutool-all:5.4.8'
+compile 'cn.hutool:hutool-all:5.5.1'
```
### 非Maven项目
点击以下任一链接,下载`hutool-all-X.X.X.jar`即可:
-- [Maven中央库1](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.4.8/)
-- [Maven中央库2](http://repo2.maven.org/maven2/cn/hutool/hutool-all/5.4.8/)
+- [Maven中央库1](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.5.1/)
+- [Maven中央库2](http://repo2.maven.org/maven2/cn/hutool/hutool-all/5.5.1/)
> 注意
> Hutool 5.x支持JDK8+,对Android平台没有测试,不能保证所有工具类或工具方法可用。
diff --git a/bin/version.txt b/bin/version.txt
index f5b71c928..7acd1cb0e 100755
--- a/bin/version.txt
+++ b/bin/version.txt
@@ -1 +1 @@
-5.4.8
+5.5.1
diff --git a/docs/js/version.js b/docs/js/version.js
index eee6b5653..02594b515 100644
--- a/docs/js/version.js
+++ b/docs/js/version.js
@@ -1 +1 @@
-var version = '5.4.8'
\ No newline at end of file
+var version = '5.5.1'
\ No newline at end of file
diff --git a/hutool-all/pom.xml b/hutool-all/pom.xml
index fb74363dc..c159e9f38 100644
--- a/hutool-all/pom.xml
+++ b/hutool-all/pom.xml
@@ -9,7 +9,7 @@
cn.hutool
hutool-parent
- 5.4.8-SNAPSHOT
+ 5.5.1-SNAPSHOT
hutool-all
diff --git a/hutool-aop/pom.xml b/hutool-aop/pom.xml
index cc4dd1044..72ce688c1 100644
--- a/hutool-aop/pom.xml
+++ b/hutool-aop/pom.xml
@@ -9,7 +9,7 @@
cn.hutool
hutool-parent
- 5.4.8-SNAPSHOT
+ 5.5.1-SNAPSHOT
hutool-aop
diff --git a/hutool-bloomFilter/pom.xml b/hutool-bloomFilter/pom.xml
index 7a8804c1c..b83689bfd 100644
--- a/hutool-bloomFilter/pom.xml
+++ b/hutool-bloomFilter/pom.xml
@@ -7,7 +7,7 @@
cn.hutool
hutool-parent
- 5.4.8-SNAPSHOT
+ 5.5.1-SNAPSHOT
hutool-bloomFilter
diff --git a/hutool-bom/pom.xml b/hutool-bom/pom.xml
index 298fe51f8..9f2e88b40 100644
--- a/hutool-bom/pom.xml
+++ b/hutool-bom/pom.xml
@@ -7,7 +7,7 @@
cn.hutool
hutool-parent
- 5.4.8-SNAPSHOT
+ 5.5.1-SNAPSHOT
hutool-bom
diff --git a/hutool-cache/pom.xml b/hutool-cache/pom.xml
index 79bb11aa9..ee465b8cf 100644
--- a/hutool-cache/pom.xml
+++ b/hutool-cache/pom.xml
@@ -7,7 +7,7 @@
cn.hutool
hutool-parent
- 5.4.8-SNAPSHOT
+ 5.5.1-SNAPSHOT
hutool-cache
diff --git a/hutool-captcha/pom.xml b/hutool-captcha/pom.xml
index b2cb99015..353279f29 100644
--- a/hutool-captcha/pom.xml
+++ b/hutool-captcha/pom.xml
@@ -7,7 +7,7 @@
cn.hutool
hutool-parent
- 5.4.8-SNAPSHOT
+ 5.5.1-SNAPSHOT
hutool-captcha
diff --git a/hutool-core/pom.xml b/hutool-core/pom.xml
index a6c6f7d84..733fc0911 100644
--- a/hutool-core/pom.xml
+++ b/hutool-core/pom.xml
@@ -9,7 +9,7 @@
cn.hutool
hutool-parent
- 5.4.8-SNAPSHOT
+ 5.5.1-SNAPSHOT
hutool-core
diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java
index dffb2a987..b56c239bd 100644
--- a/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java
@@ -1383,7 +1383,7 @@ public class CollUtil {
R value;
for (T t : collection) {
- if(null == t && ignoreNull){
+ if (null == t && ignoreNull) {
continue;
}
value = func.apply(t);
@@ -2930,4 +2930,47 @@ public class CollUtil {
void accept(K key, V value, int index);
}
// ---------------------------------------------------------------------------------------------- Interface end
+
+ /**
+ * 获取Collection或者iterator的大小,此方法可以处理的对象类型如下:
+ *
+ * - Collection - the collection size
+ *
- Map - the map size
+ *
- Array - the array size
+ *
- Iterator - the number of elements remaining in the iterator
+ *
- Enumeration - the number of elements remaining in the enumeration
+ *
+ *
+ * @param object 可以为空的对象
+ * @return 如果object为空则返回0
+ * @throws IllegalArgumentException 参数object不是Collection或者iterator
+ * @since 5.5.0
+ */
+ public static int size(final Object object) {
+ if (object == null) {
+ return 0;
+ }
+
+ int total = 0;
+ if (object instanceof Map, ?>) {
+ total = ((Map, ?>) object).size();
+ } else if (object instanceof Collection>) {
+ total = ((Collection>) object).size();
+ } else if (object instanceof Iterable>) {
+ total = IterUtil.size((Iterable>) object);
+ } else if (object instanceof Iterator>) {
+ total = IterUtil.size((Iterator>) object);
+ } else if (object instanceof Enumeration>) {
+ final Enumeration> it = (Enumeration>) object;
+ while (it.hasMoreElements()) {
+ total++;
+ it.nextElement();
+ }
+ } else if (ArrayUtil.isArray(object)) {
+ total = ArrayUtil.length(object);
+ } else {
+ throw new IllegalArgumentException("Unsupported object type: " + object.getClass().getName());
+ }
+ return total;
+ }
}
diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/IterUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/IterUtil.java
index 3a5881dd0..afe74433d 100644
--- a/hutool-core/src/main/java/cn/hutool/core/collection/IterUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/collection/IterUtil.java
@@ -10,6 +10,7 @@ import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
@@ -821,4 +822,41 @@ public class IterUtil {
public static Iterator trans(Iterator iterator, Function super F, ? extends T> function) {
return new TransIter<>(iterator, function);
}
+
+ /**
+ * 返回 Iterable 对象的元素数量
+ *
+ * @param iterable Iterable对象
+ * @return Iterable对象的元素数量
+ * @since 5.5.0
+ */
+ public static int size(final Iterable> iterable) {
+ if(null == iterable){
+ return 0;
+ }
+
+ if (iterable instanceof Collection>) {
+ return ((Collection>) iterable).size();
+ } else {
+ return size(iterable.iterator());
+ }
+ }
+
+ /**
+ * 返回 Iterator 对象的元素数量
+ *
+ * @param iterator Iterator对象
+ * @return Iterator对象的元素数量
+ * @since 5.5.0
+ */
+ public static int size(final Iterator> iterator) {
+ int size = 0;
+ if (iterator != null) {
+ while (iterator.hasNext()) {
+ iterator.next();
+ size++;
+ }
+ }
+ return size;
+ }
}
diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/impl/NumberConverter.java b/hutool-core/src/main/java/cn/hutool/core/convert/impl/NumberConverter.java
index 1f366f4ad..7d41bbb4c 100644
--- a/hutool-core/src/main/java/cn/hutool/core/convert/impl/NumberConverter.java
+++ b/hutool-core/src/main/java/cn/hutool/core/convert/impl/NumberConverter.java
@@ -15,6 +15,7 @@ import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.DoubleAdder;
import java.util.concurrent.atomic.LongAdder;
+import java.util.function.Function;
/**
* 数字转换器
@@ -54,17 +55,31 @@ public class NumberConverter extends AbstractConverter {
@Override
protected Number convertInternal(Object value) {
- return convertInternal(value, this.targetType);
+ return convert(value, this.targetType, this::convertToStr);
}
- private Number convertInternal(Object value, Class> targetType) {
+ /**
+ * 转换对象为数字
+ *
+ * @param value 对象值
+ * @param targetType 目标的数字类型
+ * @param toStrFunc 转换为字符串的函数
+ * @return 转换后的数字
+ * @since 5.5.0
+ */
+ protected static Number convert(Object value, Class> targetType, Function