泛型之通过形参确定返回值的类型
返回 List/Set 中指定类型的元素集合
仿写org.springframework.util.CollectionUtils.findValueOfType(Collection<?> collection, Class
/**
* 返回 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
源码
@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);
}