为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

holdtom 2019-03-21 18:14:51
开发业务过程中 明显感觉到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)); // 券描述 -- 券信息       两个对象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());        }像第一个还好, 可以提供一个通用的工具类如static <T>List<T> findNullElementList(List<T> srcList, List<T> destList)后面两个因为涉及到动态的获取属性值 还不好封装 难道使用java就只能这么麻烦吗?不知道其他语言针对上述场景是不是一样的麻烦?如 python javascript ruby 等
查看完整描述

7 回答

?
慕村9548890

TA贡献1884条经验 获得超4个赞

其实 Java 8 不需要 zip,


import java.util.*;

import java.util.stream.*;

查找对应集合为空的

List<String> result = IntStream.range(0, descArray.length)

        .filter(i -> codeList.get(i) == null)

        .mapToObj(i -> descArray[i])

        .collect(Collectors.toList());

关联 Map

Map<String, Integer> codeCountMap = IntStream.range(0, descArray.length)

        .boxed()

        .collect(Collectors.toMap(

                i -> codeList.get(i),

                i -> descCouponInfoMap.get(descArray[i]).getCount()));

生成 Map

Map<String, String> descCodeMap = IntStream.range(0, descArray.length)

        .boxed()

        .collect(Collectors.toMap(

                i -> descArray[i],

                i -> codeList.get(i)));


查看完整回答
反对 回复 2019-04-24
?
HUWWW

TA贡献1874条经验 获得超12个赞

很明显这是你的问题。
你知道什么是类和对象吗?
一切都用list map,当然不行。
你定义一个优惠券类,有code和desc属性
List<Ticket> ticketList;
for(Ticket ticket:ticketList){
if(ticket.getCode()==null){

System.out.println(ticket.getDesc());

}
}

第二和第三个也不说了。


查看完整回答
反对 回复 2019-04-24
?
慕标琳琳

TA贡献1830条经验 获得超9个赞

高层设计的不足,不能通过底层来弥补。


查看完整回答
反对 回复 2019-04-24
?
慕斯王

TA贡献1864条经验 获得超2个赞

楼主需要加强抽象设计和数据结构设计。

第1个场景,按位置对应就是一个非常不稳定的设计。应有具体类型


class Coupon {

   int id; //对应位置,保证不重复,也不会错位。

   String desc;

   String code;

   

   public boolean notUsed() {

       return code == null;

   }

}

这样在List中找code为空的会比较好找,但更好的是,用一个unusedList保存所有notUsedCoupon.


第2个场景做为分类统计,guava中有现成的分组方法,构造好分组后,每组的个数也就知道了。


第3个场景其实各自取一个属性并无必要,实际上完全可以构造一个对象引用到Foo和Bar,分别使用委托给

这两个对象。


就像上面有答主提到,这里缺少高层设计。当有a,b,c三个属性,如果分别设计三个List中,那么就会有

a->b,b->c的查找过程,复杂一点的操作还有a->(b, c)。如果它们在一个对象中,那么,只要a->o(a,b,c)就可

以完成大部分数据索引工作。


查看完整回答
反对 回复 2019-04-24
?
万千封印

TA贡献1891条经验 获得超3个赞

python 是解释语言,可以运行时动态获取属性

不是很懂 java,不过应该有数似的反射机制。


查看完整回答
反对 回复 2019-04-24
?
白衣染霜花

TA贡献1796条经验 获得超10个赞

java作为一门古老的语言,如果真如你所说表达力不足,何以成为全世界最流行的语言,只是你学得不好而已


查看完整回答
反对 回复 2019-04-24
  • 7 回答
  • 0 关注
  • 488 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信