我有两套角色。一个来自数据库,另一个来自 UI。我还根据角色的名称编写了两个角色的比较方法。
问题:如果使用 lambda 表达式比较值返回 true,我想提取角色(从数据库中保留一个角色)。
matchingRoleNames
工作得很好,但我正在寻找最好的 lambda 实践来做到这一点,而无需 for 循环。
这是我设置的结果,效果很好:
Set<Role> rolesFromUI = user.getRolesFromUI();
Stream <Role> roleStreamFromDB = roleService.getAllRolesStreamFromDatabase();
Set<Role> matchingRoleNames = roleStreamFromDB.filter(role->
{
for(Role roleTmp:rolesFromUI){
if(roleTmp.compareTo(role)==0){
return true;
}
}
return false;
})
public int compareTo(Role role){
return this.roleName.compareTo(role.getRoleName());
}
谢谢
最佳答案
您可以直接流过其他集合并查看其中的任何元素是否与第一个流的任何元素匹配,而不是在第一个流的 filter
中间操作中使用 foreach 循环溪流。
即:
Set<Role> matchingRoleNames = roleStreamFromDB.filter(e -> rolesFromUI.stream().anyMatch( x -> x.compareTo(e) == 0))
.collect(Collectors.toSet());
关于Java-8 使用 lambda 过滤两个集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47121474/