RT:
为了方便先创建一个类的静态属性,并赋值,业务要求,返回n条数据,不足n条全部返回
public class SubList {
private static List<Dog> dogList;
static {
Dog dog1 = Dog.builder().age(8).build();
Dog dog2 = Dog.builder().age(2).build();
Dog dog3 = Dog.builder().age(9).build();
Dog dog4 = Dog.builder().age(9).build();
Dog dog5 = Dog.builder().age(1).build();
Dog dog6 = Dog.builder().age(18).build();
Dog dog7 = Dog.builder().age(10).build();
dogList = Lists.newArrayList(dog1,dog2,dog3);
}
....
}
1、List原生的sub方法
/**
* 原生的
*/
@Test
public void test1(){
List<Dog> dogs = dogList.subList(0, 2);
System.out.println(dogs);
}
1、1源码(可自行DEBUG,ArrayList举例),由下面源码可知道,会先调用subListRangeCheck(…),进行越界检查,因为ArayList底层是数组,数组是有越界问题的,针对不同情况,源码会抛出几个异常,所以我们在使用该方法的时候也要做判断,不足几条就要全部返回
缺点:1、会出现越界问题 需要手动校验
2、会出现空指针异常 需要手动校验
public List<E> subList(int fromIndex, int toIndex) {
subListRangeCheck(fromIndex, toIndex, size);
return new SubList(this, 0, fromIndex, toIndex);
}
static void subListRangeCheck(int fromIndex, int toIndex, int size) {
if (fromIndex < 0)
throw new IndexOutOfBoundsException("fromIndex = " + fromIndex);
if (toIndex > size)
throw new IndexOutOfBoundsException("toIndex = " + toIndex);
if (fromIndex > toIndex)
throw new IllegalArgumentException("fromIndex(" + fromIndex +
") > toIndex(" + toIndex + ")");
}
2、可以使用stream流的方式,JDK8特性,优点,不足的话会全部返回
List<Dog> collect = dogList.stream().limit(10).collect(Collectors.toList());
3、可以使用一些第三方库,比如hutoo里面的CollectionUtil
//(1)、可以解决空指针问题
dogList = null;
List<Dog> sub = CollectionUtil.sub(dogList, 0, 5);
System.out.println(sub); //null
//(2)、可以解决越界问题 我一般开发就用这个工具类比较多