diff --git a/hutool-core/src/main/java/cn/hutool/v7/core/bean/BeanUtil.java b/hutool-core/src/main/java/cn/hutool/v7/core/bean/BeanUtil.java
index e1d8bf4df3..e72464f377 100644
--- a/hutool-core/src/main/java/cn/hutool/v7/core/bean/BeanUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/v7/core/bean/BeanUtil.java
@@ -183,6 +183,7 @@ public class BeanUtil {
}
// endregion
+ // region ----- beanPath
/**
* 获取Bean中的属性值
*
@@ -221,6 +222,7 @@ public class BeanUtil {
public static void setProperty(final Object bean, final String expression, final Object value) {
BeanPath.of(expression).setValue(bean, value);
}
+ // endregion
// region ----- toBean
@@ -728,9 +730,31 @@ public class BeanUtil {
return hasSetter(clazz) || hasPublicField(clazz);
}
- // endregion
- // region ----- hasXXX
+ /**
+ * 检查Bean
+ * 遍历Bean的字段并断言检查字段,当某个字段:
+ * 断言为{@code true} 时,返回{@code true}并不再检查后续字段;
+ * 断言为{@code false}时,继续检查后续字段
+ *
+ * @param bean Bean
+ * @param predicate 断言
+ * @return 是否触发断言为真
+ */
+ public static boolean checkBean(final Object bean, final Predicate predicate) {
+ if (null == bean) {
+ return true;
+ }
+ for (final Field field : FieldUtil.getFields(bean.getClass())) {
+ if (ModifierUtil.isStatic(field)) {
+ continue;
+ }
+ if (predicate.test(field)) {
+ return true;
+ }
+ }
+ return false;
+ }
/**
* 判断是否有Setter方法
@@ -829,31 +853,6 @@ public class BeanUtil {
}
// endregion
- /**
- * 检查Bean
- * 遍历Bean的字段并断言检查字段,当某个字段:
- * 断言为{@code true} 时,返回{@code true}并不再检查后续字段;
- * 断言为{@code false}时,继续检查后续字段
- *
- * @param bean Bean
- * @param predicate 断言
- * @return 是否触发断言为真
- */
- public static boolean checkBean(final Object bean, final Predicate predicate) {
- if (null == bean) {
- return true;
- }
- for (final Field field : FieldUtil.getFields(bean.getClass())) {
- if (ModifierUtil.isStatic(field)) {
- continue;
- }
- if (predicate.test(field)) {
- return true;
- }
- }
- return false;
- }
-
/**
* 获取Getter或Setter方法名对应的字段名称,规则如下:
*
diff --git a/hutool-core/src/main/java/cn/hutool/v7/core/bean/path/BeanPath.java b/hutool-core/src/main/java/cn/hutool/v7/core/bean/path/BeanPath.java
index 2fcef9a9c0..f7e12d2600 100644
--- a/hutool-core/src/main/java/cn/hutool/v7/core/bean/path/BeanPath.java
+++ b/hutool-core/src/main/java/cn/hutool/v7/core/bean/path/BeanPath.java
@@ -120,7 +120,7 @@ public class BeanPath implements Iterator> {
}
// 每一个边界符之前的表达式是一个完整的KEY,开始处理KEY
}
- if (builder.length() > 0) {
+ if (!builder.isEmpty()) {
this.node = NodeFactory.createNode(builder.toString());
// 如果以[结束,表示后续还有表达式,需保留'[',如name[0]
this.child = StrUtil.nullIfEmpty(expression.substring(c == CharUtil.BRACKET_START ? i : i + 1));
diff --git a/hutool-core/src/test/java/cn/hutool/v7/core/bean/BeanUtilTest.java b/hutool-core/src/test/java/cn/hutool/v7/core/bean/BeanUtilTest.java
index df280cdc78..7f9a0eaeb3 100644
--- a/hutool-core/src/test/java/cn/hutool/v7/core/bean/BeanUtilTest.java
+++ b/hutool-core/src/test/java/cn/hutool/v7/core/bean/BeanUtilTest.java
@@ -1131,4 +1131,26 @@ public class BeanUtilTest {
final PropertyDescriptor nonExistingField = BeanUtil.getPropertyDescriptor(Person.class, "nonExistingField");
assertNull(nonExistingField);
}
+
+ @Test
+ void testBeanToMap_IgnoreNullValue() {
+ Person person = new Person();
+ person.setName(null);
+ person.setAge(25);
+
+ // 忽略空值
+ Map map = BeanUtil.beanToMap(person, false, true);
+ assertEquals(1, map.size());
+ assertEquals(25, map.get("age"));
+ assertFalse(map.containsKey("name"));
+
+ // 不忽略空值
+ map = BeanUtil.beanToMap(person, false, false);
+ assertEquals(3, map.size());
+ assertTrue(map.containsKey("name"));
+ assertNull(map.get("name"));
+ assertEquals(25, map.get("age"));
+ assertTrue(map.containsKey("openid"));
+ assertNull(map.get("openid"));
+ }
}