如何在Java 8中使用流将列表实例转换为元素?

时间:2018-10-25 14:25:06

标签: 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;
}

我在Eclipse Oxygen中遇到以下错误:

enter image description here

请注意,statements()根据JDT docs返回了List

怎么了?

1 个答案:

答案 0 :(得分:6)

此问题是由于statements()返回原始类型 List(另请参见What is a raw type and why shouldn't we use it?)引起的。

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

您可以使用

对其进行修复
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;
}

从原始类型List到未知元素类型List<?>的列表的转换是我们在此可以进行的唯一类型安全转换。由于您仍然要检查和投射元素,因此没有限制。

但是请注意,您应该保持一致。要么使用

.filter(s -> s instanceof ExpressionStatement)
.map(s -> (ExpressionStatement)s)

.filter(ExpressionStatement.class::isInstance)
.map(ExpressionStatement.class::cast)