将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());
}