Java编程语言,使用自定义二元组对象替代map集合实现Key-Value格式的数据存储

一、背景

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集合那么重。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值