在 lambda 中处理集合时,PMD LocalVariableCouldBeFinal 仍然是一个有效规则吗?
PMD LocalVariableCouldBeFinal still a valid rule when working with collection in lambda?
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;
}
我讨厌这条规则(也许是时候考虑在我们的项目中禁用它了)。好吧,首先错误消息说它 可以 是最终的,而不是 必须 是最终的,这就像一个小建议,而不是每个规则-se.
特别是因为你的变量是有效最终无论如何,我会抑制这个警告,或者更好地(可能)完全摆脱它(不确定 PMD 允许这个)。
但是您可以通过简单的重构来解决这个问题:
return nodes.stream()
.map(String::toUpperCase)
.flatMap(n -> getAdjacentNodes(n).stream())
.filter(nodeId -> !(nodes.contains(nodeId.toLowerCase())))
.collect(Collectors.toSet());
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;
}
我讨厌这条规则(也许是时候考虑在我们的项目中禁用它了)。好吧,首先错误消息说它 可以 是最终的,而不是 必须 是最终的,这就像一个小建议,而不是每个规则-se.
特别是因为你的变量是有效最终无论如何,我会抑制这个警告,或者更好地(可能)完全摆脱它(不确定 PMD 允许这个)。
但是您可以通过简单的重构来解决这个问题:
return nodes.stream()
.map(String::toUpperCase)
.flatMap(n -> getAdjacentNodes(n).stream())
.filter(nodeId -> !(nodes.contains(nodeId.toLowerCase())))
.collect(Collectors.toSet());