开发业务过程中 明显感觉到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");
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<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 等
ringa_lee2017-04-18 09:58:58
最初の段落の意味がよくわかりません...
私の理解は次のとおりです: あなたのニーズを実現できる便利なツールはありますか?
はい、Java に最も欠かせないのはツールです。基本的に、必要なツールを考えれば、オンラインで検索すれば 99% の場合に見つかります。
を使用することをお勧めします。java8+google guava
は任意に組み合わせて使用できます。両方を同時に使用することをお勧めします。
3 つの例で述べた状況に基づくと、答えは次のとおりです。
リーリーQ: 2 つの要素セットからもう一方のセットの同じ位置にある空の要素を見つけます。
A: まず、descArray
とcodeList
をマージする zip メソッドを記述することをお勧めします。を 1 つのオブジェクト配列に変換し、オブジェクトの配列を操作します。
その後:
リーリーQ: セットは別のセットを通じてマップに関連付けられ、新しいマップを生成します
A: 同様に、まず 2 つの配列をオブジェクト配列に圧縮してから、次のようにします。 リーリー
Q: 2 つのオブジェクト リストのそれぞれが属性を抽出してマップを形成しますA: 同様に、まず 2 つの配列をオブジェクト配列に圧縮してから、次のようにします。 リーリー
属性値を動的に取得することについて言及しましたが、Java8 では、メソッド参照を通じて属性値を取得できました。
リーリー は であるため、従来はリフレクションでしか実現できなかった多くの機能が、couponInfo::getCount
メソッドを介して supplier
を参照することで実現できます。
上で述べたように、Java8 を使用しない場合でも、guava を使用してこれらの機能をエレガントに実装できます。
大家讲道理2017-04-18 09:58:58
実際、Java 8 には zip は必要ありません。
リーリー大家讲道理2017-04-18 09:58:58
明らかに、これはあなたの問題です。
クラスとオブジェクトが何であるか知っていますか?
すべてにリストマップを使用することはもちろん不可能です。
code 属性と desc 属性を使用してクーポン クラスを定義します。
List<Ticket> ticketList;
for(Ticket ticket:ticketList){
if(ticket.getCode()==null){
}
}
2 番目と 3 番目については説明しません。
阿神2017-04-18 09:58:58
ポスターは抽象的なデザインとデータ構造のデザインを強化する必要があります。
最初のシーンは、位置に基づいて非常に不安定なデザインです。特定のタイプが必要です
List 内で空のコードを持つものを見つけるのは簡単ですが、unusedList を使用してすべての notusedCoupon を保存するとさらに良いです。
2 番目のシナリオは分類統計として使用されます。グアバには既製のグループ化方法があり、グループが構築された後、各グループの数がわかります。
3 番目のシナリオでは、それぞれ属性を取得する必要はありません。実際、Foo と Bar へのオブジェクト参照を構築し、それぞれ 2 つのオブジェクト
への委任を使用できます。
上記の回答者が述べたように、ここには高度な設計が欠如しています。属性が a、b、c の 3 つある場合、それぞれ 3 つの List を設計すると、
a->b、b->c という検索処理が発生し、さらに複雑な操作は a- >(b,c)。これらがオブジェクト内にある場合は、a->o(a,b,c) でデータのインデックス付け作業のほとんどを
完了できます。
天蓬老师2017-04-18 09:58:58
Python はインタープリタ言語であり、実行時に属性を動的に取得できます
Java についてはよくわかりませんが、同様のリフレクション メカニズムがいくつかあるはずです。
PHP中文网2017-04-18 09:58:58
チケットとコードを分離するために配列やリストを使用しないでください。チケットとコードの間には 1 対 1 の関係がある必要があります。モデルを構築するときに、コード属性を含むチケット クラスを作成できます。これは非常に明白ではないでしょうか?
PHP中文网2017-04-18 09:58:58
Java は冗長な言語であり、Java で書かれたコードは基本的に非常に冗長です (8 より前)
Java だけでは基本的な操作を処理するには Python や他の言語ほど洗練されていませんが、使用することはできます。ツール クラスやその他の Groovy などを通じて修正してください。