加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 如何通过实例获取列表的所有元素?

发布时间:2020-12-14 05:37:38 所属栏目:Java 来源:网络整理
导读:如何按实例获取列表的所有元素? 我有一个列表,可以有一个接口Foo的任何类实现: interface Foo;class Bar implements Foo; 我想使用java8 stream api提供一个实用程序方法来提取特定类类型的所有元素: public static T extends Foo ListT getFromList(List
如何按实例获取列表的所有元素?

我有一个列表,可以有一个接口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());
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读