!865 优化BeanPath.set方法,避免多次重复调用get方法

Merge pull request !865 from emptypoint/update-BeanPath
This commit is contained in:
Looly 2022-11-10 02:40:54 +00:00 committed by Gitee
commit 912c3e116d
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F

View File

@ -15,6 +15,7 @@ import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects;
/** /**
* Bean路径表达式用于获取多层嵌套Bean中的字段值或Bean对象<br> * Bean路径表达式用于获取多层嵌套Bean中的字段值或Bean对象<br>
@ -116,6 +117,7 @@ public class BeanPath implements Serializable {
* @param value * @param value
*/ */
public void set(final Object bean, final Object value) { public void set(final Object bean, final Object value) {
Objects.requireNonNull(bean);
set(bean, this.patternParts, lastIsNumber(this.patternParts), value); set(bean, this.patternParts, lastIsNumber(this.patternParts), value);
} }
@ -140,15 +142,15 @@ public class BeanPath implements Serializable {
* @param patternParts 表达式块列表 * @param patternParts 表达式块列表
* @param value * @param value
*/ */
private void set(final Object bean, final List<String> patternParts, final boolean nextNumberPart, final Object value) { private Object set(final Object bean, final List<String> patternParts, final boolean nextNumberPart, final Object value) {
Object subBean = this.get(patternParts, bean, true); Object subBean = this.get(patternParts, bean, true);
if (null == subBean) { if (null == subBean) {
final List<String> parentParts = getParentParts(patternParts); final List<String> parentParts = getParentParts(patternParts);
this.set(bean, parentParts, lastIsNumber(parentParts), nextNumberPart ? new ArrayList<>() : new HashMap<>()); // 避免get方法的重复调用
//set中有可能做过转换因此此处重新获取bean subBean = this.set(bean, parentParts, lastIsNumber(parentParts), nextNumberPart ? new ArrayList<>() : new HashMap<>());
subBean = this.get(patternParts, bean, true);
} }
BeanUtil.setFieldValue(subBean, patternParts.get(patternParts.size() - 1), value); BeanUtil.setFieldValue(subBean, patternParts.get(patternParts.size() - 1), value);
return value;
} }
/** /**