将Java筛选器列表转换为泛型类型T

将Java筛选器列表转换为泛型类型T,java,Java,如何执行以下操作(此操作未编译): List getElementsOf(){ return list.stream() .过滤器(x->T的x实例) .map(x->(T)x) .collect(toList()); } 使用的例子是什么?理想情况下,它应该类似于obj.getElementsOf()我得到了以下结果: <T> List<T> getChildrenOf(Class<T> clazz) { return children.strea

如何执行以下操作(此操作未编译):

List getElementsOf(){
return list.stream()
.过滤器(x->T的x实例)
.map(x->(T)x)
.collect(toList());
}
使用的例子是什么?理想情况下,它应该类似于
obj.getElementsOf()

我得到了以下结果:

<T> List<T> getChildrenOf(Class<T> clazz) {
    return children.stream()
            .filter(node -> node.getClass() == clazz)
            .map(node -> clazz.<T>cast(node))
            .collect(toList());
}

List<Mesh> nameNodes = b.getChildrenOf(Mesh.class);
List getChildrenOf(类clazz){
返回children.stream()
.filter(节点->节点.getClass()==clazz)
.map(节点->clazz.cast(节点))
.collect(toList());
}
List nameNodes=b.getChildrenOf(Mesh.class);

尽管另一个答案基本上可以解决问题,但这里有一个更好的答案:

<T> List<T> getElementsOf(Class<T> clazz) {
    return list.stream()
            .filter(clazz::isInstance)
            .map(clazz::cast)
            .collect(toList());
}
List getElementsOf(类clazz){
return list.stream()
.filter(clazz::isInstance)
.map(clazz::cast)
.collect(toList());
}
请注意,
clazz::isInstance
thingy。它没有比较这两个类,而是使用
isInstance
方法。根据文档,这相当于
instanceof
,这是您首先想要的

此方法是Java语言instanceof运算符的动态等效方法


请注意,泛型类型信息在运行时会被删除,因此为了更清楚,我将
T
Object
进行了交换。实际上,
对象
也不会在那里,但我保留了它以使其更清晰,其中
t
是:

List<Object> getElementsOf() {
    return list.stream()
        .filter(x -> x instanceof Object) // this is legal, as Object is an actual type, T isn't
        .map(x -> (Object) x)
        .collect(toList());
}

另外请注意,使用该方法,在提供类型时将永远不会获得
null
值<在这种情况下,code>isInstance将返回
false

您是否可以更具体地说明您的需求、要求、问题等。
列表的类型是什么
是否为
对象
-如果是这种情况,则
实例
无效您可能对番石榴感兴趣。注意第一个流等价物,它与@Sweeper的解决方案相同。我想你也可以
map(clazz::cast)
而不是
map(x->(T)x)
@lexicore哦,我没有注意到!现在编辑!
List<Object> getElementsOf() {
    return list.stream()
        .filter(x -> x instanceof Object) // this is legal, as Object is an actual type, T isn't
        .map(x -> (Object) x)
        .collect(toList());
}
<T> List<T> getElementsOf(Class<T> type) {
    return list.stream()
               .filter(type::isInstance)
               .map(type::cast)
               .collect(toList());
}
List getElementsOf(Class type) {
    return list.stream()
               .filter(type::isInstance) // is type an Object? is it Long? we don't mind... we passed it and we deliver it
               .map(type::cast) // actually this isn't really needed, if you have a return type of List (as you already filtered for the types you want)
               .collect(toList());
}