将ArrayList<SuperClass>转换为ArrayList<SubClass>

3

我知道这听起来有点傻,但我真的需要它。 我100%确定只允许SubClass进入arraylist。没有其他SuperClass的子类在该arraylist中。

我该怎么做?

    Map<String, List<Nodo>> map = ((Cast to ArrayList<NodoMoore> here)nodos).stream().
collect(Collectors.groupingBy(Nodo::getSalida));

我的类实现了一个接口,使我使用Nodo而不是NodoMoore,但getSalida方法不是Nodo方法,只是NodoMoore方法。


你能展示一下几个骨架类的定义,以帮助我们复制您所看到的内容吗?此外,哪个类实现了该接口? - Makoto
2
你能先进行映射吗?例如,使用强制转换将一个Nodo映射到一个NodoMoore上。 - matt
2个回答

8

如果你确定 nodos 只包含 NodoMoore 的实例,那么你可以通过强制转换将 Nodo 实例映射到 NodoMoore 实例:

Map<String, List<NodoMoore>> map = 
    nodos.stream()
         .map(n->(NodoMoore)n)
         .collect(Collectors.groupingBy(NodoMoore::getSalida));

我假设 NodoMooreNodo 的子类。

1
你好,DaoWen的回答有我想要的输出,但这也是一个非常有用的答案。 - AFP_555
1
在我看来,稍微更优雅的解决方案是使用 nodos.stream().map(NodoMoore.class::cast).collect(Collectors.groupingBy(NodoMoore::getSalida)),因为它更易读。 - andred
你好,我对这个“::”的东西还不熟悉。为什么它更优雅? - AFP_555
NodoMoore.class::cast 等同于 p -> NodoMoore.class.cast(p)。使用 :: 运算符,您可以隐式地填充方法的参数,或者如果该方法是非静态的但没有提供实例,则为实例指定应运行的方法。例如,FooFactory::createFromFoo::toString - andred
抱歉,我有点偏离了您的问题。这种方式更优雅,因为即使对于非Java极客来说也更易读。 - andred

6

不要使用方法句柄(Nodo::getSalida),可以使用lambda表达式并在其中执行转换:

Map<String, List<Nodo>> map = nodos.stream()
    .collect(Collectors.groupingBy(x->((NodoMoore)x).getSalida());

太棒了,我从来不知道我能做到这一点。谢谢! - AFP_555
请注意,此答案和Eran的答案具有不同的返回类型。您可以根据所需的返回类型选择其中一种方法。 - DaoWen
1
这是期望的输出。由于接口的原因,我无法使用List<NodoMoore>。 - AFP_555

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接