Java中forEach方法Lambda表达式出现“String无法转换为void”错误的原因?
Lambda表达式返回类型错误原因分析
问题场景与代码
我有一个Users类,内部维护一个User对象的List集合,想要实现一个方法完成以下功能:
- 构建String类型的List集合(存储所有User的userID)
- 检查传入的String是否存在于该集合中
Users类代码
public class Users { List<User> users; public Users(List<User> users) { this.users = new ArrayList<>(); } //... public boolean checkUserExists(String targetUserID) { List<String> userIDS = users.forEach(user -> user.userID); return userIDS.contains(targetUserID); } }
User类代码
package menus.DataStructures; public class User { String userType; String userID; String userName; int userAge; protected User(String userType, String userID, String userName, int userAGe) { this.userType = userType; this.userID = userID; this.userName = userName; this.userAge = userAGe; } }
运行代码时,SonarLint在Lambda表达式下方提示错误:Bad return type in lambda expression: String cannot be converted to void
错误原因
forEach的Lambda要求无返回值:forEach方法接收的是Consumer类型的参数,这个接口的抽象方法accept是无返回值(void)的。你在Lambda里返回了user.userID这个String类型的值,不符合Consumer的要求,因此编译器报错。forEach本身返回void,无法赋值给List:forEach方法的返回类型是void,你试图把它的返回值赋值给List<String>变量,这本身就是语法错误。
修正方案
方案1:用Stream的map+collect生成ID列表再检查
import java.util.stream.Collectors; public boolean checkUserExists(String targetUserID) { List<String> userIDS = users.stream() .map(user -> user.userID) // 将User对象转换为userID字符串 .collect(Collectors.toList()); // 收集为List return userIDS.contains(targetUserID); }
方案2:直接用anyMatch高效检查(推荐)
不需要生成完整的ID列表,直接在流中匹配是否存在目标ID,性能更优:
public boolean checkUserExists(String targetUserID) { return users.stream() .anyMatch(user -> targetUserID.equals(user.userID)); }
额外修正:构造函数的问题
原构造函数没有将传入的users集合赋值给成员变量,会导致后续users列表始终为空,修正如下:
public Users(List<User> users) { this.users = new ArrayList<>(users); // 拷贝传入的集合,避免外部修改影响内部 // 或者直接 this.users = users;(如果允许共享集合引用) }
内容的提问来源于stack exchange,提问作者LeperAffinity666
相关产品推荐
相关产品推荐

