如何使用Java 8 Lambda表达式将一种类型的List转换为其子类型的List

Oma*_*eji 19 java lambda casting java-8

我似乎只能在C#而不是Java中找到如何做到这一点.

我有一个,List<TypeX>但我知道该列表中的每个元素实际上都是TypeXCalled 的子类TypeY.

如何编写接受List<TypeX>并返回的Lambda表达式List<TypeY>

Bor*_*der 24

对于我的例子,我将使用以下类:

class TypeX {}
class TypeY extends TypeX {}
Run Code Online (Sandbox Code Playgroud)

然后我有一个List<TypeX>:

final List<TypeX> xList = ...
Run Code Online (Sandbox Code Playgroud)

您需要做的就是使用方法引用TypeY.class.cast:

final List<TypeY> yList = xList.stream()
                               .map(TypeY.class::cast)
                               .collect(toList());
Run Code Online (Sandbox Code Playgroud)

您还filter()可以排除将导致错误的项目:

final List<TypeY> yList = xList.stream()
                               .filter(TypeY.class::isInstance)
                               .map(TypeY.class::cast)
                               .collect(toList());
Run Code Online (Sandbox Code Playgroud)

使用示例:

import static java.util.stream.Collectors.toList;
Run Code Online (Sandbox Code Playgroud)

  • 我将接受这个作为正确的答案,因为过滤器可以排除错误,但我建议提及收集器的静态导入或更改Collectors.toList()的答案. (5认同)

das*_*ght 6

使用以下map方法完成Java项目:

List<TypeY> res = listTypeX
    .stream()
    .map((x) -> (TypeY)x)
    .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)