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

开发业务过程中 明显感觉到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을 사용하는 것이 좋습니다. 두 가지를 동시에 사용하는 것이 좋습니다.

위 세 가지 사례에서 언급하신 상황에 대한 답변은 다음과 같습니다.

Q: 두 요소 세트 중 다른 세트의 같은 위치에 있는 빈 요소를 찾습니다
A: 우선 descArraycodeList를 병합하는 zip 메소드를 작성하는 것이 좋습니다. 하나의 객체 배열로 변환한 다음 객체 배열에서 작동합니다.

으아악

그런 다음:

으아악

Q: 세트는 다른 세트를 통해 맵과 연결되어 새 맵을 생성합니다

A: 같은 방법으로 먼저 두 배열을 객체 배열로 압축한 다음:

으아악

Q: 두 객체 목록 각각은 속성을 추출하여 맵을 형성합니다

A: 같은 방법으로 먼저 두 배열을 객체 배열로 압축한 다음:

으아악

java8 이전에는 리플렉션을 통해 속성 값을 동적으로 얻을 수 있다고 언급하셨습니다. 여기서는 java8을 예로 들어 보겠습니다. 으아악

couponInfo::getCount입니다. 이러한 원리를 바탕으로 과거에 Reflection을 통해서만 달성할 수 있었던 많은 기능을 Java8에서는 supplier 메소드를 통해 를 참조하여 구현할 수 있습니다.

위에서 언급했듯이 Java8을 사용하지 않더라도 guava를 사용하면 이러한 기능을 우아하게 구현할 수 있습니다.

참고:

  1. http://ifeve.com/google-guava/

  2. http://www.importnew.com/1036...

  3. http://www.importnew.com/1190...

大家讲道理

사실 Java 8에는 zip이 필요하지 않습니다.

으아악

해당 비어 있는 세트 찾기

으아악

관련지도

으아악

지도 생성

으아악
大家讲道理

분명히 이것이 당신의 문제입니다.
클래스와 객체가 무엇인지 아시나요?
물론 모든 것에 목록 맵을 사용하는 것은 불가능합니다.
코드 및 설명 속성을 사용하여 쿠폰 클래스를 정의합니다.
List<Ticket> ticketList;
for(Ticket ticket:ticketList){
if(ticket.getCode()==null){

으아악

}
}

두 번째, 세 번째 이야기는 하지 않겠습니다.

小葫芦

고수준 디자인의 단점은 저수준 디자인으로는 보완할 수 없습니다.

阿神

포스터는 추상적인 디자인과 데이터 구조 디자인을 강화해야 합니다.
첫 번째 장면은 위치에 따라 매우 불안정한 디자인입니다. 특정 유형이 있어야 합니다

으아악

목록에서 빈 코드가 있는 항목을 찾는 것이 더 쉬우며, 더 나은 방법은 미사용 목록을 사용하여 모든 notUsedCoupon을 저장하는 것입니다.

두 번째 시나리오는 분류 통계로 사용됩니다. 그룹이 구성된 후 각 그룹의 수를 알 수 있는 기성 그룹화 방법이 있습니다.

세 번째 시나리오에서는 각각 속성을 취할 필요가 없습니다. 실제로 Foo와 Bar를 참조하는 객체를 구성하고 두 객체에 각각 위임을 사용할 수 있습니다
.

위 응답자께서 말씀하신 것처럼 여기서는 수준 높은 디자인이 부족합니다. a, b, c 세 개의 속성이 있을 때 각각 세 개의 List를 디자인한다면
a->b, b->c의 검색 과정이 있게 되며, 좀 더 복잡한 연산은 a- >(b, c). 객체에 있는 경우 a->o(a,b,c)는
대부분의 데이터 인덱싱 작업을 완료할 수 있습니다.

Peter_Zhu

Python은 해석된 언어이며 런타임 시 동적으로 속성을 얻을 수 있습니다

저는 Java를 잘 모르지만 유사한 반사 메커니즘이 여러 개 있을 것입니다.

左手右手慢动作

Java는 당신이 말한 것처럼 표현력이 부족하다면 왜 세계에서 가장 인기 있는 언어가 되었을까요?

Ty80

티켓과 코드를 구분하기 위해 배열이나 목록을 사용하지 마세요. 티켓과 코드 사이에는 일대일 관계가 있어야 합니다. 모델을 구축할 때 코드 속성이 포함된 티켓 클래스를 생성할 수 있다는 점은 매우 명확하지 않나요?

洪涛

Java는 장황한 언어이고, Java로 작성된 코드는 기본적으로 꽤 장황합니다(8 이전).
Java만으로는 기본적인 작업을 처리하는 데에는 Python이나 다른 언어만큼 우아하지는 않지만 사용할 수 있습니다. 툴클래스, 그루비 등을 통해 수정해보세요.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!