nullable ArgMap value

This commit is contained in:
Timi
2026-06-04 18:29:03 +08:00
parent 22cff23b96
commit f9a985f939
8 changed files with 234 additions and 7 deletions

View File

@@ -49,6 +49,28 @@ public class ArgMap<K, V> {
entries.forEach(entry -> consumer.accept(entry.getKey(), entry.getValue()));
}
/**
* 按插入顺序遍历全部非空参数。
*
* @param consumer 处理逻辑
*/
private void forEachNonNull(BiConsumer<? super K, ? super V> consumer) {
entries.forEach(entry -> {
if (entry.getValue() != null) {
consumer.accept(entry.getKey(), entry.getValue());
}
});
}
/**
* 是否存在可输出的非空参数。
*
* @return 是否存在非空参数
*/
private boolean hasNonNullValue() {
return entries.stream().anyMatch(entry -> entry.getValue() != null);
}
/**
* 返回参数数量。
*
@@ -90,7 +112,7 @@ public class ArgMap<K, V> {
*/
public HttpEntity toEntity() {
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
forEach((k, v) -> {
forEachNonNull((k, v) -> {
String key = k.toString();
switch (v) {
case File file -> builder.addBinaryBody(key, file);
@@ -109,7 +131,7 @@ public class ArgMap<K, V> {
*/
public List<NameValuePair> toNameValuePair() {
Form form = Form.form();
forEach((k, v) -> form.add(k.toString(), v.toString()));
forEachNonNull((k, v) -> form.add(k.toString(), v.toString()));
return form.build();
}
@@ -119,11 +141,11 @@ public class ArgMap<K, V> {
* @return query string
*/
public String toURL() {
if (isEmpty()) {
if (!hasNonNullValue()) {
return "";
}
StringBuilder sb = new StringBuilder();
forEach((k, v) -> sb.append(k.toString()).append('=').append(Encoder.urlArg(v.toString())).append('&'));
forEachNonNull((k, v) -> sb.append(k.toString()).append('=').append(Encoder.urlArg(v.toString())).append('&'));
sb.deleteCharAt(sb.length() - 1);
return sb.toString();
}
@@ -135,7 +157,8 @@ public class ArgMap<K, V> {
* @return 拼接后的 URL
*/
public String toURL(String url) {
if (isEmpty()) {
String query = toURL();
if (query.isEmpty()) {
return url;
}
StringBuilder sb = new StringBuilder(url);
@@ -143,10 +166,10 @@ public class ArgMap<K, V> {
if (!url.endsWith("?") && !url.endsWith("&")) {
sb.append('&');
}
sb.append(toURL());
sb.append(query);
return sb.toString();
}
return url + "?" + toURL();
return url + "?" + query;
}
/**