开发业务过程中 明显感觉到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 等
첫 번째 문단의 의미를 잘 모르겠습니다...
내가 이해한 바는: 귀하의 요구 사항을 충족할 수 있는 편리한 도구가 있습니까?
네, Java에서 가장 빼놓을 수 없는 것은 도구입니다. 기본적으로 필요한 도구가 무엇인지 생각하고 온라인으로 검색하면 99%의 경우에서 찾을 수 있습니다.
어떤 조합으로도 사용할 수 있는
java8+google guava
을 사용하는 것이 좋습니다. 두 가지를 동시에 사용하는 것이 좋습니다.위 세 가지 사례에서 언급하신 상황에 대한 답변은 다음과 같습니다.
으아악그런 다음:
으아악A: 같은 방법으로 먼저 두 배열을 객체 배열로 압축한 다음:
으아악A: 같은 방법으로 먼저 두 배열을 객체 배열로 압축한 다음:
으아악java8 이전에는 리플렉션을 통해 속성 값을 동적으로 얻을 수 있다고 언급하셨습니다. 여기서는 java8을 예로 들어 보겠습니다. 으아악
은
위에서 언급했듯이 Java8을 사용하지 않더라도 guava를 사용하면 이러한 기능을 우아하게 구현할 수 있습니다.couponInfo::getCount
입니다. 이러한 원리를 바탕으로 과거에 Reflection을 통해서만 달성할 수 있었던 많은 기능을 Java8에서는supplier
메소드를 통해 를 참조하여 구현할 수 있습니다.참고:
사실 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)는
대부분의 데이터 인덱싱 작업을 완료할 수 있습니다.
Python은 해석된 언어이며 런타임 시 동적으로 속성을 얻을 수 있습니다
저는 Java를 잘 모르지만 유사한 반사 메커니즘이 여러 개 있을 것입니다.
Java는 당신이 말한 것처럼 표현력이 부족하다면 왜 세계에서 가장 인기 있는 언어가 되었을까요?
티켓과 코드를 구분하기 위해 배열이나 목록을 사용하지 마세요. 티켓과 코드 사이에는 일대일 관계가 있어야 합니다. 모델을 구축할 때 코드 속성이 포함된 티켓 클래스를 생성할 수 있다는 점은 매우 명확하지 않나요?
Java는 장황한 언어이고, Java로 작성된 코드는 기본적으로 꽤 장황합니다(8 이전).
Java만으로는 기본적인 작업을 처리하는 데에는 Python이나 다른 언어만큼 우아하지는 않지만 사용할 수 있습니다. 툴클래스, 그루비 등을 통해 수정해보세요.