开发业务过程中 明显感觉到java语言表达力的不足 就好像没有桌子的概念 所以每次提到桌子都得通过这么一长串的文字--有光滑平板、由腿或其它支撑物固定起来的家具,用以吃饭、写字、工作或玩牌
--来表达桌子的概念 反正开发过程中我是有点晕
下面是几个比较典型的例子
业务背景
购买某些商品 会给用户发一些优惠券 如2张满100减50优惠券 1张满200减50优惠券等
我提供一个了接口 接收上述券信息
先查询redis判断该券是不是已经存在 如
hmget key 100_50 200_50
如果券不存在 先去创建 然后将其放到redis中 如hmset key 100_50 84678bfd7c1011e6a22b4437e6d0648e
最后得到券编码和张数的映射关系 批量发券
batchSendCouponsToUser(userId,couponCodeCountMap);
两个元素集合 找出对应的另一个集合中同一位置为空的元素
String[] descArray = {"aaa", "bbb", "ccc"}; // 券描述 如 满100减50
List<String> codeList = newArrayList("111", null, "333"); // 券编码
// 找出尚不存在code的券
List<String> nullElementList = newArrayList();
for (int i = 0; i < codeList.size(); i++) {
if (codeList.get(i) == null) {
nullElementList.add(descArray[i]);
}
}
assertThat(nullElementList).containsExactly("bbb");
一个集合与一个Map通过另一个集合来关联 并生成一个新的Map
String[] descArray = {"aaa", "bbb", "ccc"}; // 券描述
List<String> codeList = newArrayList("111", "222", "333"); // 券编码
Map<String,CouponInfo> descCouponInfoMap = ImmutableMap.of("aaa", new CouponInfo("aaa", 1), "bbb", new CouponInfo("bbb", 2), "ccc", new CouponInfo("ccc", 3)); // 券描述 -- 券信息
// 得到券编码与发放张数Map
Map<String,Integer> codeCountMap = new HashMap<>();
for (int i = 0; i < codeList.size(); i++) {
codeCountMap.put(codeList.get(i), descCouponInfoMap.get(descArray[i]).getCount());
}
assertThat(codeCountMap).containsExactly(new DefaultMapEntry("111",1),new DefaultMapEntry("222",2),new DefaultMapEntry("333",3));
两个对象list各抽取一个属性 组成一个Map
List<Foo> fooList = newArrayList(new Foo("aaa"), new Foo("bbb"), new Foo("ccc"));
List<Bar> barList = newArrayList(new Bar("111"), new Bar("222"), new Bar("333"));
Map<String,String> descCodeMap = new HashMap<>(); // 券描述 -- 券编码
// 将两个List各抽取一个属性成Map
for (int i = 0; i < fooList.size(); i++) {
descCodeMap.put(fooList.get(i).getDesc(), barList.get(i).getCode());
}
assertThat(descCodeMap).contains(new DefaultMapEntry("aaa","111"),new DefaultMapEntry("bbb","222"),new DefaultMapEntry("ccc","333"));
像第一个还好, 可以提供一个通用的工具类如
static <T>List<T> findNullElementList(List<T> srcList, List<T> destList)
后面两个因为涉及到动态的获取属性值 还不好封装 难道使用java就只能这么麻烦吗?
不知道其他语言针对上述场景是不是一样的麻烦?
如 python javascript ruby 等
不是很懂你第一段话要表达什么意思……
我理解为:有没有方便的工具可以实现你的需求?
有的,java最不缺的就是工具类,基本上只要想到需要什么工具,上网搜一下,99%的情况下都能搜出来。
建议使用
java8+google guava
,可以任意搭配使用,两者同时使用更佳。就你这3个例子所说的情况,逐一解答如下:
然后:
A: 同理,先把两个数组zip成对象数组,然后:
A: 同理,先把两个数组zip成对象数组,然后:
其中你所提到的动态获取属性值,在java8之前,你可以通过反射来动态获取属性值,在java8,你可以通过方法引用来获取,这里我以java8为例:
couponInfo::getCount
就是一个supplier
,基于这个原理,以前很多只能通过反射才能实现的功能,在java8中可以通过方法引用去实现。以上,就算不用java8,也可以借助guava去优雅的实现这些功能。
参考资料:
http://ifeve.com/google-guava/
http://www.importnew.com/1036...
http://www.importnew.com/1190...