/** * 根据 refId 和 funcCode 查询收藏个数 * * @param refIds 关联资的 id * @param funCode `like` 点赞 `collect`收藏 * @param module 模块 * @return refId 和数量映射 */ Map<Long, Integer> collectCountByRef(List<Long> refIds, String funCode, Integer module); /** * 查询收藏或点赞状态 * @param module 1:**** * @param userId 用户 id * @param funCode `like` 点赞 `collect`收藏 * @param ds id * @return inspireId 和状态映射 */ Map<Long, Boolean> getCollectStatus(Integer module, Long userId, String funCode, List<Long> inspireIds);
![]() | 1 wxw752 2024-09-01 00:26:00 +08:00 封装个对象,返回的时候对象接收。我们公司查库之后严禁返回 Map |
![]() | 2 inza9hi 2024-09-01 00:49:44 +08:00 用 Map 相当于把静态语言当做动态语言用。如果能好好管理一下 Map 的 Key ,其实也还好,胜在自由。 |
![]() | 3 SoloCompany 2024-09-01 01:15:57 +08:00 ![]() @wxw752 你有看问的是啥吗, 那请问 Map<Long, Integer> 如何封装成一个对象? 一个有 2 的 64 次方个字段的对象, 字段名分别为 r0, r1, 到 r 无穷吗 |
![]() | 4 ZiLong 2024-09-01 01:43:03 +08:00 ![]() 对象类型就是命名的 Map ,换一下思路,改成 List<XXX>,XXX 是你定义的返回对象类型,比如你第一个方法,XXX 的属性就是 filedName ,count |
5 mx1700 2024-09-01 01:51:10 +08:00 via Android 我觉得可读性没什么问题呀,如果非要改,可以把 map 封装到一个类里,比如叫 CollectCounter ,类暴露一个方法: getCount(refId) |
![]() | 6 Znemo 2024-09-01 01:57:50 +08:00 ![]() 非要讲究某种意义上的可读性的话,就一个类持有一个 Map 或者继承某个 Map ,做一样的事,再提供一些查询函数。在你这个场景中,感觉意义不是很大。 |
![]() | 7 dallaslu 2024-09-01 02:04:44 +08:00 不如给 Map 变量起个好名字: ```java Map<Long, Integer> likeCountOfRefId = collectCountByRef(refIds, "like", module); ``` |
8 iseki 2024-09-01 06:36:13 +08:00 via Android 我觉得还行,没啥问题,你又不是返回个 Map<String, Any>,你还是觉得实在不行,把这个 Map 自己包一下给个名字,不过我觉得没必要。 |
![]() | 9 xiangyuecn 2024-09-01 07:42:37 +08:00 好了,8 小时的工作量变 1 小时了 |
10 wssy001 2024-09-01 09:13:01 +08:00 bean 字段是确认的,那就禁用 Map 如果是动态的,那就和定规矩的吵一架,要么把动态字段需求砍掉,要么就允许用 Map |
![]() | 11 shitshit666 OP @dallaslu 是的目前是这个样子,包括写注释,但是别人看到这个方法的时候还是可能会蒙 |
![]() | 12 shitshit666 OP @xiangyuecn 确实 |
![]() | 13 shitshit666 OP @iseki 目前打算是包一层了,多人协作,可维护性也很重要。 |
![]() | 14 sitshit666 OP 找到一个方法叫枚举 key 的 map: https://blog.51cto.com/u_16213606/7112798 |
![]() | 15 sagaxu 2024-09-01 10:05:45 +08:00 Map 可读性差,说的是 key 表示字段名,value 是值,这是用 Map 表达 POJO ,读代码的人无法感知有哪些字段,IDE 也不能补全,拼写错误也照常编译。 而你这个例子,返回的 data 并不是 POJO ,key 本身也是开发时无法穷举列出的值,此 Map 是 value to value 的映射。这就不适合用其它方式封装。如果你的 value 是开发时可确定的状态,比如说订单状态,流程状态,那么可以定义 enum 类型代替 Long ,返回 Map<enum, V>,至于内部是用 EnumMap 还是 HashMap ,这都不是调用者该关心的。 |
![]() | 16 VeryZero 2024-09-01 10:29:31 +08:00 用枚举。 map 不是一定就可读性差,主要是语意是否清晰 |
17 leonshaw 2024-09-01 13:12:36 +08:00 via Android 你的例子应该返回 List ,跟输入对应。 |
![]() | 18 wxw752 2024-09-01 16:59:42 +08:00 @SoloCompany #3 我从未在我司的代码中看到任何 Map 返回的参数。无论是什么,肯定是有方法封装的。 |
![]() | 19 itechify PRO 那你返回 list 对象,用的时候再转 map 。。。 |
![]() | 20 diagnostics 2024-09-02 01:48:12 +08:00 @SoloCompany List<XX> 不行吗?用 Map 是因为要 O(1) 查询,只用来迭代的话,Tuple ,Object 都能描述一个 String + Long |
![]() | 21 cuizibo 2024-09-02 10:17:37 +08:00 批量查询改为单个查询 返回 int hhh |
22 ala2008 2024-09-02 11:06:40 +08:00 返回一个对象不就好了,属性有 ID 和数量 |
![]() | 23 liyanggyang 2024-09-02 14:36:38 +08:00 @SoloCompany #3 我也觉得,如果强制要求,就只有返回时候 对象接收。鉴于 Map<Long, Integer> 如何封装成一个对象? 一个有 2 的 64 次方个字段的对象, 字段名分别为 r0, r1, 到 r 无穷吗。 那就返回 List<DTO> , DTO: private String key; private String value; key set 变量名称:r0, r1, 到 r 无穷 value set 值 |
![]() | 24 Mandelo 2024-09-02 16:27:55 +08:00 感觉多此一举了,都是基础的包装类,又不是 Long,Obj 这种 |
25 runliuv 2024-09-02 17:49:49 +08:00 用实体类返回,完美! |
![]() | 26 Aresxue 2024-09-02 17:57:48 +08:00 1.一般是对外的接口层( http 、rpc 、mq )是需要一定避免 Map 的,内部方法合理即可不需要一定避免; 2.针对你这个 case 非要搞可以搞个 List<xxxCount>对象,意义聊胜于无,从性能来说 Map 还更好些。 |
![]() | 27 mmdsun 2024-09-02 18:04:09 +08:00 @SoloCompany 返回 List+ 对象呢? List<RefIdAndCount> class RefIdAndCount{ Long id; Long count } 另外 op 文章里面的 map+枚举可以换成 java.util.EnumMap; |
![]() | 28 shitshit666 OP @Aresxue 谢谢,目前考虑避免掉 map 了 |
![]() | 29 shitshit666 OP @oneisall8955 打算这样了 |
![]() | 30 shitshit666 OP @leonshaw 有道理 |
![]() | 31 AlexBob 2024-09-03 10:43:17 +08:00 JsonNode,我是这样做的,它能和框架完美的契合,而且序列化也不操心! |
![]() | 32 SoloCompany 2024-09-03 21:11:47 +08:00 @mmdsun 没想到这么无意义的问题还有人在讨论, 我算是理解了啥是尽信书不如无书 试问 Stream.collect(Collectors.groupingBy()) 为啥返回的是 Map<K, List<T>> 而不是 SomeFxxkingUnmeaningEntry<K, T> |