ホームページ  >  に質問  >  本文

关于java语言表达力不足的几个例子及可有好的封装方法

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

巴扎黑巴扎黑2763日前547

全員に返信(9)返信します

  • ringa_lee

    ringa_lee2017-04-18 09:58:58

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

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

    はい、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...
    3. 返事
      0
  • 大家讲道理

    大家讲道理2017-04-18 09:58:58

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

    リーリー

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

    リーリー

    関連マップ

    リーリー

    マップを生成

    リーリー

    返事
    0
  • 大家讲道理

    大家讲道理2017-04-18 09:58:58

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

    リーリー

    }
    }

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

    返事
    0
  • 高洛峰

    高洛峰2017-04-18 09:58:58

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

    返事
    0
  • 阿神

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

    返事
    0
  • 天蓬老师

    天蓬老师2017-04-18 09:58:58

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

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

    返事
    0
  • ringa_lee

    ringa_lee2017-04-18 09:58:58

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

    返事
    0
  • PHP中文网

    PHP中文网2017-04-18 09:58:58

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

    返事
    0
  • PHP中文网

    PHP中文网2017-04-18 09:58:58

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

    返事
    0
  • キャンセル返事