泛型之通过形参确定返回值的类型

返回 List/Set 中指定类型的元素集合

仿写org.springframework.util.CollectionUtils.findValueOfType(Collection<?> collection, Class type)

    /**
     * 返回 List/Set 中指定类型的元素集合
     * @param collection
     * @param type
     * @param <T>
     * @return
     */
    public static <T> List<T> findValuesMatchType(Collection<?> collection, @Nullable Class<T> type) {
        List<T> list = new ArrayList<>();
        if (collection == null || collection.isEmpty() || type == null) {
            return list;
        }
        Iterator iterator = collection.iterator();
        while (iterator.hasNext()) {
            Object next = iterator.next();
            if (type.isInstance(next)) {
                list.add((T) next);
            }
        }
        return list;
    }

Class 对象的 isInstance(),判断是否是某个类的实例

public native boolean isInstance(Object obj);

测试

    @Test
    public void test7() {
        List<Object> list = new ArrayList<>();
        list.add(1L);
        list.add(2);
        list.add("45");
        list.add("85");
        list.add('d');
        List<String> list2 = findValuesMatchType(list, String.class);
        System.out.println(list2);
		//[45,85]
    }

CollectionUtils.findValueOfType

org.springframework.util.CollectionUtils.findValueOfType(Collection<?> collection, Class type)

源码

    @Nullable
    public static <T> T findValueOfType(Collection<?> collection, @Nullable Class<T> type) {
        if (isEmpty(collection)) {
            return null;
        } else {
            T value = null;
            Iterator var3 = collection.iterator();

            while(true) {
                Object element;
                do {
                    if (!var3.hasNext()) {
                        return value;
                    }

                    element = var3.next();
                } while(type != null && !type.isInstance(element));

                if (value != null) {
                    return null;
                }

                value = element;
            }
        }
    }

测试代码

   @Test
    public void test5() {

        List<Object> list = new ArrayList<>();
        list.add(1L);
        list.add(2);
        list.add("5");
        list.add(2);
        //返回 List/Set 中指定类型的元素。指定类型的元素只能有一个,如果是多个的话返回null
        String valueOfType = CollectionUtils.findValueOfType(list, String.class);
        System.out.println(valueOfType);
    }
posted @ 2022-08-18 23:20  进击的小蔡鸟  阅读(281)  评论(0编辑  收藏  举报