首页 > 解决方案 > 在 lambda 中使用集合时,PMD LocalVariableCouldBeFinal 仍然是有效规则吗?

问题描述

PMD 规则记录为LocalVariableCouldBeFinal

我有一个实用程序来派生相邻节点,这些节点将根据过滤和业务代码进行填充。

下面的代码清楚地传达了稍后将填充该集合的意图。

因此,这条规则仍然适用吗?对于在代码中使用集合的任何此类实例,无论这是否是局部变量?

public static Set<String> getAdjacentNodes(final Set<String> nodes) {
    final Set<String> nodesLocal = nodes.stream()
            .map(node -> node.toUpperCase())
            .collect(Collectors.toSet());
    //PMD Complaining on below line of adjacentNodeSet : LocalVariableCouldBeFinal 
    Set<String> adjacentNodeSet = new HashSet<>();
    nodesLocal.stream()
            .forEach(node -> adjacentNodeSet.addAll(getAdjacentNodes(node)));

    Set<String> adjNodeList = adjacentNodeSet
            .stream()
            .filter(nodeId -> !(nodesLocal.contains(nodeId)))
            .collect(Collectors.toSet());

    return adjNodeList;
}

标签: javacheckstylepmd

解决方案


讨厌这条规则(也许是时候让我考虑在我们的项目中禁用它了)。好吧,首先错误消息说它可能是最终的,而不是它必须是最终的,这就像一个很小的建议,而不是一个规则本身。

特别是因为你的变量实际上是最终的,我会抑制这个警告,或者更好(可能)完全摆脱它(不确定 PMD 是否允许这样做)。

但是你可以通过一个简单的重构来解决这个问题:

return nodes.stream()
            .map(String::toUpperCase)
            .flatMap(n -> getAdjacentNodes(n).stream())
            .filter(nodeId -> !(nodes.contains(nodeId.toLowerCase())))
            .collect(Collectors.toSet());

推荐阅读