项目背景:一个APP需要对6万余人同时推送消息,但是消息推送能力每次只有500,所以需要将一个包含6万多元素的List按500的长度为一组分割成多个List。
代码:
//list按指定长度分割方法
private List<List<PushMessageExcel>> splitList(List<PushMessageExcel> messagesList, int groupSize) {
int length = messagesList.size();
// 计算可以分成多少组
int num = (length + groupSize - 1) / groupSize; // TODO
List<List<PushMessageExcel>> newList = new ArrayList<>(num);
for (int i = 0; i < num; i++) {
// 开始位置
int fromIndex = i * groupSize;
// 结束位置
int toIndex = (i + 1) * groupSize < length ? (i + 1) * groupSize : length;
newList.add(messagesList.subList(fromIndex, toIndex));
}
return newList;
}
//该接口为消息推送接口,只展示使用List分割部分代码。
@RequestMapping(path = "send")
public void send( @RequestParam(required = true) String[] devices) throws IOException {
前端入参为一个数组,先将数组转list
List<PushMessageExcel> messages = new ArrayList<>();
for (int a = 0; a < devices.length; a++) {
PushMessageExcel pushMessage = new PushMessageExcel();
pushMessage.setDeviceToken(devices[a]);
messages.add(pushMessage);
}
//list按指定长度分割,按500分割
List<List<PushMessageExcel>> list = splitList(messages, 500);
//遍历分割结果逐一取出新的list
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i).toString());
}
}