关于java语言表达力不足的几个例子及可有好的封装方法
巴扎黑
巴扎黑 2017-04-18 09:56:58
0
9
551

开发业务过程中 明显感觉到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 等

巴扎黑
巴扎黑

全員に返信(9)
左手右手慢动作

最初の段落の意味がよくわかりません...

私の理解は次のとおりです: あなたのニーズを実現できる便利なツールはありますか?

はい、Java に最も欠かせないのはツールです。基本的に、必要なツールを考えれば、オンラインで検索すれば 99% の場合に見つかります。

を使用することをお勧めします。java8+google guava は任意に組み合わせて使用​​できます。両方を同時に使用することをお勧めします。

3 つの例で述べた状況に基づくと、答えは次のとおりです。

Q: 2 つの要素セットからもう一方のセットの同じ位置にある空の要素を見つけます。
A: まず、descArraycodeList をマージする zip メソッドを記述することをお勧めします。を 1 つのオブジェクト配列に変換し、オブジェクトの配列を操作します。

リーリー

その後:

リーリー

Q: セットは別のセットを通じてマップに関連付けられ、新しいマップを生成します

A: 同様に、まず 2 つの配列をオブジェクト配列に圧縮してから、次のようにします。 リーリー

Q: 2 つのオブジェクト リストのそれぞれが属性を抽出してマップを形成します

A: 同様に、まず 2 つの配列をオブジェクト配列に圧縮してから、次のようにします。 リーリー

属性値を動的に取得することについて言及しましたが、Java8 では、メソッド参照を通じて属性値を取得できました。

リーリー

であるため、従来はリフレクションでしか実現できなかった多くの機能が、couponInfo::getCount メソッドを介して supplier を参照することで実現できます。 上で述べたように、Java8 を使用しない場合でも、guava を使用してこれらの機能をエレガントに実装できます。

参照:

    http://ifeve.com/google-guava/
  1. http://www.importnew.com/1036...
  2. http://www.importnew.com/1190...
いいねを押す +0
大家讲道理

実際、Java 8 には zip は必要ありません。

リーリー

対応する空のセットを検索します

リーリー

関連マップ

リーリー

マップを生成

リーリー
いいねを押す +0
大家讲道理

明らかに、これはあなたの問題です。
クラスとオブジェクトが何であるか知っていますか?
すべてにリストマップを使用することはもちろん不可能です。
code 属性と desc 属性を使用してクーポン クラスを定義します。
List<Ticket> ticketList;
for(Ticket ticket:ticketList){
if(ticket.getCode()==null){

リーリー

}
}

2 番目と 3 番目については説明しません。

いいねを押す +0
小葫芦

上位レベルの設計の欠点は、下位レベルで補うことはできません。

いいねを押す +0
阿神

ポスターは抽象的なデザインとデータ構造のデザインを強化する必要があります。
最初のシーンは、位置に基づいて非常に不安定なデザインです。特定のタイプが必要です

リーリー

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) でデータのインデックス付け作業のほとんどを
完了できます。

いいねを押す +0
Peter_Zhu

Python はインタープリタ言語であり、実行時に属性を動的に取得できます

Java についてはよくわかりませんが、同様のリフレクション メカニズムがいくつかあるはずです。

いいねを押す +0
左手右手慢动作

あなたが言ったように、Java は古い言語です。表現力が十分ではないのであれば、なぜそれが世界で最も人気のある言語になったのですか?

いいねを押す +0
Ty80

チケットとコードを分離するために配列やリストを使用しないでください。チケットとコードの間には 1 対 1 の関係がある必要があります。モデルを構築するときに、コード属性を含むチケット クラスを作成できます。これは非常に明白ではないでしょうか?

いいねを押す +0
洪涛

Java は冗長な言語であり、Java で書かれたコードは基本的に非常に冗長です (8 より前)
Java だけでは基本的な操作を処理するには Python や他の言語ほど洗練されていませんが、使用することはできます。ツール クラスやその他の Groovy などを通じて修正してください。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート