List截取的几种方式

携手创作,共同成长!这是我参与「掘金日新计划 · 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());

猜你喜欢

转载自juejin.im/post/7128396284204941348