我知道.contains
需要一个字符串。变量可以是多个字符串结构。就像String... role
可以"user", "admin"
.或者String... role
可以"user"
.
无论传递到它什么,都会被使用。
所以我有一个过滤器 - 我试图在其中查看字符串类型的 getter 是否包含在 varargs 中找到的值......
String a = Arrays.toString(role);
System.out.print(a);
TypeOfObject roles = userProjectRoles.stream().filter(userProjectRole ->
userProjectRole.getRole().getName().equals(a)).findFirst().orElse(null);
a 有括号,它不是一个字符串,而是一个作为字符串值发送的数组。
你能帮我解决这个问题吗?
将输入数组转换为 Set 并使用其contains()
方法
Set<String> roleSet = new HashSet<>(Arrays.asList(role));
TypeOfObject roles = userProjectRoles.stream()
.filter(userProjectRole -> roleSet.contains(userProjectRole.getRole().getName())
.findFirst()
.orElse(null);
您可以使用筛选器userProjectRoles
和anyMatch方法来检查roles
是否包含该角色:
var result = userProjectRoles.stream()
.map(role -> role.getRole().getName())
.filter(roleName -> Arrays.stream(roles).anyMatch(role -> roleName.equals(role)))
.collect(Collectors.toList())
or
var result = userProjectRoles.stream()
.map(role -> role.getRole().getName())
.filter(roleName -> {
for (String role : roles) if (roleName.equals(role)) return true;
return false;
})
.collect(Collectors.toList())
如果我正确理解您的问题,这将为您提供userProjectRoles
名称也在roles
数组中的所有元素。
如果情况相反,并且您希望roles
数组中的所有元素也在userProjectRoles
中,您可以这样做:
List<String> roleNames =
roles.stream()
.map(role -> role.getRole().getName())
.collect(Collectors.toList());
var result = Arrays.stream(roles).stream()
.filter(roleNames::contains)
.collect(Collectors.toList())
我假设您正试图从 Arrays#toString 中删除 [ 和 ],但目前尚不清楚,因为没有直接答案。如果是这样,这就是方法。
值得注意的是,这是不安全的,因为角色的结果可能是多个值,而不是单个值。
String a = Arrays.toString(role).replaceAll("\[", "").replaceAll("]", "");
另一种方法是检查角色数组是否包含角色名称。即;
TypeOfObject roles = userProjectRoles.stream()
.filter(userProjectRole -> Stream.of(a).anyMatch(roleName -> userProjectRole.getRole().getName().equals(roleName))
.findFirst()
.orElse(null);