nullable ArgMap value
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
package com.imyeyu.network.test;
|
||||
|
||||
import com.imyeyu.network.ArgMap;
|
||||
import org.apache.hc.core5.http.NameValuePair;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
@@ -33,4 +36,22 @@ public class ArgMapTest {
|
||||
assert argMap.toURL().equals("id=1&id=2");
|
||||
assert argMap.toURL("/detail").equals("/detail?id=1&id=2");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void nullValueToURLTest() {
|
||||
assert ArgMap.of("key", null).toURL().isEmpty();
|
||||
assert ArgMap.of("key", null).toURL("/detail").equals("/detail");
|
||||
assert ArgMap.of("key", null).toURL("/detail?id=123").equals("/detail?id=123");
|
||||
|
||||
String url = ArgMap.of("key", null, "name", "夜雨").toURL("/detail");
|
||||
assert url.equals("/detail?name=%E5%A4%9C%E9%9B%A8");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void nullValueToNameValuePairTest() {
|
||||
List<NameValuePair> pairs = ArgMap.of("key", null, "name", "value").toNameValuePair();
|
||||
assert pairs.size() == 1;
|
||||
assert pairs.getFirst().getName().equals("name");
|
||||
assert pairs.getFirst().getValue().equals("value");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user