Code snippet: subListSafely()

    /**
     * @param list      can be null
     * @param fromIndex inclusive
     * @param endIndex  exclusive
     * @param <T>
     * @return
     */
    public static <T> List<T> subListSafely(List<T> list, int fromIndex, int endIndex) {
        if(list == null){
            return new ArrayList<>();
        }

        if(fromIndex < 0 || endIndex <= 0){
            return new ArrayList<>();
        }

        if (list.size() - 1 < fromIndex) {
            return new ArrayList<>();
        }
        return list.subList(fromIndex, Math.min(endIndex, list.size()));
    }
}

And the unit test:

    @Test
    public void subListSafely(){
        // null list
        assertArrayEquals(new Object[]{}, MyCollectionUtils.subListSafely(null, 0, 3).toArray());

        //empty list
        assertArrayEquals(new Object[]{}, MyCollectionUtils.subListSafely(new ArrayList<String>(), 0, 3).toArray());
        assertArrayEquals(new Object[]{}, MyCollectionUtils.subListSafely(new ArrayList<String>(), 1, 3).toArray());

        //non-empty list, increasing fromIndex one by one
        assertArrayEquals(new Object[]{}, MyCollectionUtils.subListSafely(Arrays.asList("a", "b", "c"), -1, 3).toArray());
        assertArrayEquals(new Object[]{"a", "b", "c"}, MyCollectionUtils.subListSafely(Arrays.asList("a", "b", "c"), 0, 3).toArray());
        assertArrayEquals(new Object[]{"b", "c"}, MyCollectionUtils.subListSafely(Arrays.asList("a", "b", "c"), 1, 3).toArray());
        assertArrayEquals(new Object[]{"c"}, MyCollectionUtils.subListSafely(Arrays.asList("a", "b", "c"), 2, 3).toArray());
        assertArrayEquals(new Object[]{}, MyCollectionUtils.subListSafely(Arrays.asList("a", "b", "c"), 3, 3).toArray());
        assertArrayEquals(new Object[]{}, MyCollectionUtils.subListSafely(Arrays.asList("a", "b", "c"), 4, 3).toArray());

        //non-empty list, decrease endIndex one by one
        assertArrayEquals(new Object[]{"a", "b", "c"}, MyCollectionUtils.subListSafely(Arrays.asList("a", "b", "c"), 0, 4).toArray());
        assertArrayEquals(new Object[]{"a", "b", "c"}, MyCollectionUtils.subListSafely(Arrays.asList("a", "b", "c"), 0, 3).toArray());
        assertArrayEquals(new Object[]{"a", "b"}, MyCollectionUtils.subListSafely(Arrays.asList("a", "b", "c"), 0, 2).toArray());
        assertArrayEquals(new Object[]{"a"}, MyCollectionUtils.subListSafely(Arrays.asList("a", "b", "c"), 0, 1).toArray());
        assertArrayEquals(new Object[]{}, MyCollectionUtils.subListSafely(Arrays.asList("a", "b", "c"), 0, 0).toArray());
        assertArrayEquals(new Object[]{}, MyCollectionUtils.subListSafely(Arrays.asList("a", "b", "c"), 0, -1).toArray());
    }

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.