如何按实例获取列表的所有元素?
我有一个列表,可以有一个接口Foo的任何类实现:
interface Foo; class Bar implements Foo;
我想使用java8 stream api提供一个实用程序方法来提取特定类类型的所有元素:
public static <T extends Foo> List<T> getFromList(List<Foo> list,Class<T> type) { return (List<T>) list.stream().filter(entry -> type.isInstance(entry)).collect(Collectors.toList()); }
使用:
List<Foo> list; List<Bar> bars = Util.getFromList(list,Bar.class);
结果:它可以工作,但由于未经检查的强制转换(List< T>),我必须添加@SuppressWarnings.我怎么能避免这个?
解决方法
引入扩展S的另一个类型参数是正确的,但是,为了将结果作为List< S>而不是List< T>,您必须.map()将类型:: isInstance谓词传递给S.
public static <T extends Foo,S extends T> List<S> getFromList(List<T> list,Class<S> type) { return list.stream() .filter(type::isInstance) .map(type::cast) .collect(Collectors.toList()); }
正如@Eran所建议的那样,这甚至可以简化为仅使用一个类型参数:
public static <T extends Foo> List<T> getFromList(List<Foo> list,Class<T> type) { return list.stream() .filter(type::isInstance) .map(type::cast) .collect(Collectors.toList()); }