携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情
如何截取一个list的部分元素
一、List原生的sub方法
List<Person> persons = personList.subList(0, 10);
复制代码
有点:进行越界检查,因为ArayList底层是数组,数组是有越界问题的,针对不同情况,源码会抛出几个异常,所以我们在使用该方法的时候也要做判断,不足几条就要全部返回; 缺点:1、会出现越界问题 需要手动校验
二、可以使用stream流的方式,JDK8特性,优点,不足的话会全部返回
List<Person> collect = personList.stream().limit(10).collect(Collectors.toList());
复制代码
三、可以使用一些第三方库,比如hutoo里面的CollectionUtil
personList = null;
List<Person> sub = CollectionUtil.sub(personList, 0, 10);
System.out.println(sub); //null
复制代码
(1)、可以解决空指针问题 (2)、可以解决越界问题
如何将Java中List拆分为多个小list集合
一、list.sublist这个方法如何使用。
list.sublist(int fromIndex, int toIndex)方法有两个参数。
fromIndex:为起始索引(包含)
toIndex:为终止索引(不包含)的子列表(List)
但值得注意的是,返回的这个子列表的幕后其实还是原列表;也就是说,修改这个子列表,将导致原列表也发生改变;反之亦然。
public static <T> List<List<T>> splistList(List<T> list,int subNum) {
List<List<T>> tNewList = new ArrayList<List<T>>();
int priIndex = 0;
int lastPriIndex = 0;
int insertTimes = list.size()/subNum;
List<T> subList = new ArrayList<>();
for (int i = 0;i <= insertTimes;i++) {
priIndex = subNum*i;
lastPriIndex = priIndex + subNum;
if (i == insertTimes) {
subList = list.subList(priIndex,list.size());
} else {
subList = list.subList(priIndex,lastPriIndex);
}
if (subList.size() > 0) {
tNewList.add(subList);
}
}
return tNewList;
}
复制代码
二、使用hutool-all工具包的ListUtil.split(list,100)
ListUtil.split(userIds, 1000).stream().forEach(ids -> {
executorService.execute(() -> {
// 构建消息推送体
});
});
}
复制代码
三、使用google的guava包下的partition方法
public static <T> List<List<T>> partition(List<T> list, int size) {
Preconditions.checkNotNull(list);
Preconditions.checkArgument(size > 0);
return (List)(list instanceof RandomAccess ? new Lists.RandomAccessPartition(list, size) : new Lists.Partition(list, size));
}
List<List<Work>> toETLList = Lists.partition(workList,500);
for (List<Work> tempList : toETLList) {
if (Boolean.TRUE.equals(isNeedMongodb)) {
try {
Thread.sleep(2 * 1000L);
} catch (InterruptedException e) {
log.info("insertOrUpdateWorkorderEtl: {}", e.getMessage());
Thread.currentThread().interrupt();
}
//todo
}
复制代码
如何将一个list中的元素的某属性取出来单独放到一个list/map里面
一、将所有对象的某两个字段提取出来生成一个新Map
List<vo> list = new ArrayList<>();
Map<String, String> map = list.stream().collect(Collectors.toMap(vo::getxxx, vo::getxxx));
复制代码
二、将所有对象的某一字段提取出来生成一个新列表。
List newList = objectList.stream().map(Object::getVar).collect(Collectors.toList());