在 Java 中使用 Streams 和 filter,并与 varargs 匹配



我知道.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);

相关内容

  • 没有找到相关文章

最新更新