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)、可以解决越界问题   我一般开发就用这个工具类比较多
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐