如何使用Java 8中的流在List实例中转换元素?

Ale*_*xSC 1 java-8 java-stream

鉴于代码:

public Statement methodCallByName(MethodDeclaration method, String string) {
    List<ExpressionStatement> expressions = method.getBody().statements().stream()
                                                .filter(s -> s instanceof ExpressionStatement)
                                                .map(ExpressionStatement.class::cast)
                                                .collect(Collectors.toList());
    return null;
}
Run Code Online (Sandbox Code Playgroud)

我在Eclipse Oxygen中有以下错误:

在此输入图像描述

请注意,根据JDT文档statements()返回a .List

怎么了?

Hol*_*ger 6

问题是由statements()返回原始类型 引起的List(另请参阅什么是原始类型以及为什么我们不应该使用它?).

原始类型不仅可能引发未经检查的操作,还可能限制类型推断的适用性.

你可以解决它

public Statement methodCallByName(MethodDeclaration method, String string) {
    List<?> statements = method.getBody().statements();
    List<ExpressionStatement> expressions = statements.stream()
        .filter(s -> s instanceof ExpressionStatement)
        .map(ExpressionStatement.class::cast)
        .collect(Collectors.toList());
    // ...
    return null;
}
Run Code Online (Sandbox Code Playgroud)

从原始类型List到未知元素类型列表的List<?>转换是我们可以在此处执行的唯一类型安全转换.既然你要检查并投射元素,那不是限制.

但请注意,您应该尽量保持一致.使用其中之一

.filter(s -> s instanceof ExpressionStatement)
.map(s -> (ExpressionStatement)s)
Run Code Online (Sandbox Code Playgroud)

要么

.filter(ExpressionStatement.class::isInstance)
.map(ExpressionStatement.class::cast)
Run Code Online (Sandbox Code Playgroud)