一、背景
url请求地址,后面使用&把多个请求参数拼接起来,例如:?p1=v1&p2=v2&p3=v3
它们的key分别是p1/p2/p3,对应的value分别是v1/v2/v3。
也许很多人都会通过map集合来存储,算比较通用的做法了:
Map<String, String> map = Maps.newHashMap();
map.put("p1","v1");
map.put("p2","v2");
map.put("p3","v3");
本文欲介绍另一种自定义的二元组对象,实现像map那样的key-value格式的数据存储。
二、二元组Tuple
public class Tuple<T1, T2> {
T1 _1;
T2 _2;
public Tuple(T1 _1, T2 _2) {
this._1 = _1;
this._2 = _2;
}
}
这里使用了泛型,如果你的是key和value都是string类型,那么Tuple<String, String> tuple = new Tulple<String, String> () ;
进一步说,如果你的value是Tuple二元组,那么Tuple<String, Tuple<String, String>> tuple = new Tuple<String, Tuple<String, String>> () ;
三、Query
- 定义成员变量params,它是一个二元组列表,而且二元组本身是一个嵌套的二元组(它的value又是一个二元组)
- mergeWith() 批量拼接参数
- append(),新增参数至二元组列表里
- appendIf(),把value强制转换为string类型
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
public class Query {
private final List<Tuple<String, Tuple<String, String>>> params = new ArrayList<Tuple<String, Tuple<String, String>>>();
public Query append(final String name, final String value) throws UnsupportedEncodingException {
params.add(new Tuple<String, Tuple<String, String>>(name, new Tuple<String, String>(value, URLEncoder.encode(value, "UTF-8"))));
return this;
}
public <T> Query appendIf(final String name, final T value) throws UnsupportedEncodingException {
if (value != null) {
append(name, value.toString());
}
return this;
}
public boolean mergeWith(Query query) {
return params.addAll(query.params);
}
@Override
public String toString() {
// 略
}
}
1、toString() 把二元组列表转换为String
把java对象转换为http请求参数列表。
@Override
public String toString() {
final StringBuilder builder = new StringBuilder();
for (final Tuple<String, Tuple<String, String>> param : params) {
if (builder.length() == 0) {
builder.append('?');
} else {
builder.append('&');
}
builder.append(param._1);
builder.append('=');
builder.append(param._2._2);
}
return builder.toString();
}
2、测试
@Test
public void mixedStyle_append() throws UnsupportedEncodingException {
Query query = new Query()
.append("p1", "v1");
query.append("p2", "v2");
query = query.append("p3", "v3");
assertEquals("?p1=v1&p2=v2&p3=v3", query.toString());
}
四、总结
Java编程是强类型语言,且面向对象编程,我们一般都会定义类及对象,当发起http请求的时候,经常会需要转换对象。
本文提供了一种轻量级的Key-Value格式的数据存储,显然它没有Map集合那么重。