Java 8流修复中间流方法不应保留未使用的声纳问题

时间:2019-01-18 12:17:46

标签: java java-8 sonarqube java-stream

 group.getTeamMemberIds().stream().filter(id -> userMap.containsKey(id)).
            map(id -> groupDTO.getTeamMembers().add(userMap.get(id)));

Sonar检测到此情况,因为不应将Intermediate Stream方法保留为主要错误

2 个答案:

答案 0 :(得分:5)

这里没有终端操作,因此将不执行该流;因此声纳出现“未使用”错误。

您也有以下副作用:id -> groupDTO.getTeamMembers().add(userMap.get(id)

有更好的解决方法:

List<String> teamMembers = group.getTeamMemberIds() // I assume String here...
                      .stream()
                      .map(userMap::get)
                      .filter(Objects::notNull)
                      .collect(Collectors.toList());


groupDTO.getTeamMembers().addAll(teamMembers);

您几乎不需要containsKey后跟get-通过执行get并查看结果是否不是null

答案 1 :(得分:2)

如果getTeamMembers是一个Set或地图值是唯一的(ID!):

groupDTO.getTeamMembers().addAll(userMap.values());

否则

groupDTO.getTeamMembers().addAll(new HashSet<String>(userMap.values()));

错误是Stream是运行的准备;直到完成最后的终止操作:.forEach.collect等。按照编码,甚至不需要执行任何操作,即死代码。