java - 在 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;
}
解决方案
我讨厌这条规则(也许是时候让我考虑在我们的项目中禁用它了)。好吧,首先错误消息说它可能是最终的,而不是它必须是最终的,这就像一个很小的建议,而不是一个规则本身。
特别是因为你的变量实际上是最终的,我会抑制这个警告,或者更好(可能)完全摆脱它(不确定 PMD 是否允许这样做)。
但是你可以通过一个简单的重构来解决这个问题:
return nodes.stream()
.map(String::toUpperCase)
.flatMap(n -> getAdjacentNodes(n).stream())
.filter(nodeId -> !(nodes.contains(nodeId.toLowerCase())))
.collect(Collectors.toSet());
推荐阅读
- php - OM\Db::query(string $statement) 的声明必须与 PDO::query 兼容
- android - 同一设备的前置摄像头和后置摄像头可以支持不同的硬件级别吗?
- apache - IIS 10/Apache 问题 - web.config
- github - Github 操作,gradle。git log 的 pretty=format 标志不起作用
- python - 将字典字符串转换为字典列表
- javascript - React Native - 如何使用 UI 动态更新应用程序语言?
- javascript - Java 返回 cannont invoke ScriptEngine 错误
- database - 我的 ER 图是否正确地代表了一个基本网站?
- python - Python:删除具有两个特定条件的数据帧行并保留其余行
- css - Emotion vs Styled-Components css` prop