开发业务过程中 明显感觉到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 codeList = newArrayList("111", null, "333"); // 券编码 // 找出尚不存在code的券 List nullElementList = newArrayList(); for (int i = 0; i < codeList.size(); i++) { if (codeList.get(i) == null) { nullElementList.add(descArray[i]); } } assertThat(nullElementList).containsExactly("bbb");
String[] descArray = {"aaa", "bbb", "ccc"}; // 券描述 List codeList = newArrayList("111", "222", "333"); // 券编码 Map descCouponInfoMap = ImmutableMap.of("aaa", new CouponInfo("aaa", 1), "bbb", new CouponInfo("bbb", 2), "ccc", new CouponInfo("ccc", 3)); // 券描述 -- 券信息 // 得到券编码与发放张数Map Map 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 fooList = newArrayList(new Foo("aaa"), new Foo("bbb"), new Foo("ccc")); List barList = newArrayList(new Bar("111"), new Bar("222"), new Bar("333")); Map 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 List findNullElementList(List srcList, List 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...
其實 Java 8 不需要 zip,
找出對應集合為空的
關聯 Map
產生 Map
很明顯這是你的問題。
ticketList;
你知道什麼是類別和物件嗎?
一切都用list map,當然不行。
你定義一個優惠券類,有code和desc屬性
List
for(Ticket ticket:ticketList){
if(ticket.getCode()==null){
}
}
第二和第三個也不說了。
高層設計的不足,不能用底層來彌補。
樓主需要加強抽象設計和資料結構設計。
第1個場景,依位置對應就是一個非常不穩定的設計。應有具體類型
這樣在List中找code為空的會比較好找,但更好的是,用一個unusedList保存所有notUsedCoupon.
第2個場景做為分類統計,guava中有現成的分組方法,建構好分組後,每組的數量也就知道了。
第3個場景其實各自取一個屬性並無必要,實際上完全可以建構一個物件引用到Foo和Bar,分別使用委託給
這兩個物件。
就像上面有答主提到,這裡缺少高層設計。當有a,b,c三個屬性,如果分別設計三個List中,那麼就會有
a->b,b->c的查找過程,複雜一點的操作還有a->(b, c )。如果它們在一個物件中,那麼,只要a->o(a,b,c)就可
以完成大部分資料索引工作。
python 是解釋語言,可以運行時動態取得屬性
不是很懂 java,不過應該有數似的反射機制。
java作為一門古老的語言,如果真如你所說表達力不足,何以成為全世界最流行的語言,只是你學得不好而已
不要用陣列或list去分開票和編碼,票和編碼應該是一對一的關係吧。在建立模型的時候可以建立一個票的類別啊,裡面有code屬性,這樣不就很明確了麼
java一門囉嗦型語言, 用java寫的程式碼基本上都挺囉嗦的(8之前).
java單獨處理基本操作確實不如pyhton等語言優雅, 不過可以透過工具類以及其它Groovy等進行彌補.