![](/img/trans.png)
[英]How can I fix this nested collection code using Java Stream in order to create an array of string from the property of an object?
[英]How can I use Java Stream in order to iterate on a collection on object and use a specific string field of each object to create a new array?
我不太喜欢 Java Stream 并且我有以下问题。
我正在以这种方式生成 JWT 令牌。 JWT 令牌生成只是我正在处理的上下文,但它与我的问题并不严格相关。 我的问题与如何从 n 个对象的特定字段创建一个字符串列表到一个集合有关。
所以我有以下情况:
我有这个用户object:
@Data
public class User {
private int id;
private String firstName;
private String middleName;
private String surname;
private char sex;
private Date birthdate;
private String taxCode;
private String eMail;
private String pswd;
private String contactNumber;
private Date createdAt;
private Set<Address> addressesList;
private Set<UserType> userTypes;
}
如您所见,它包含Set<UserType> userTypes
字段,表示可能的用户类型的集合(基本上是用户配置文件,例如“ADMIN”、“READER”、MODERATOR”,这是因为在我的系统中,单个用户可以拥有多个用户类型)。
这是UserType定义:
@Data
public class UserType {
private int id;
private String typeName;
private String description;
Set<Operation> operations;
}
所以基本上感兴趣的领域是typeName 。 从Set<UserType> userTypes
我必须获得一个字符串列表,例如:**["ADMIN", "READER", "SIMPLE_USER"] 其中数组 object 是typeName字段的值。
在我的代码中,我有这个方法:
private String doGenerateToken(Map<String, Object> claims, UserDetailsWrapper userDetailsWrapper) {
final Date createdDate = clock.now();
final Date expirationDate = calculateExpirationDate(createdDate);
// MOCKED USER PROFILES COLLECTION:
ArrayList<String> userProfiles = new ArrayList<String>();
userProfiles.add("SIMPLE_USER");
userProfiles.add("MODERATOR");
return Jwts.builder()
.setClaims(claims)
.setSubject(userDetailsWrapper.getUserDetails().getUsername())
.claim("name", userDetailsWrapper.getUserCompleteInfo().getFirstName() + " "
+ userDetailsWrapper.getUserCompleteInfo().getMiddleName() + " "
+ userDetailsWrapper.getUserCompleteInfo().getSurname())
.claim("user_profiles", userProfiles)
//.claim("user_profiles", userDetailsWrapper.getUserCompleteInfo().getUserTypes().stream().map(UserType::getUserType).collect(Collectors.toList()))
.claim("authorities", userDetailsWrapper.getUserDetails().getAuthorities().stream().map(GrantedAuthority::getAuthority).collect(Collectors.toList()))
.setIssuedAt(createdDate)
.setExpiration(expirationDate)
.signWith(SignatureAlgorithm.HS512, jwtConfig.getSecret().getBytes())
.compact();
}
正如您在前面的代码片段中看到的那样,我已经模拟了userProfiles ArrayList,然后我通过以下方式将其添加到我的 JWT 令牌有效负载中:
.claim("user_profiles", userProfiles)
它工作正常。 问题是我必须从返回的集合开始做同样的事情(这是前面提到的Set<UserType> userTypes
字段):
userDetailsWrapper.getUserCompleteInfo().getUserTypes()
基本上我需要一种方法来使用 Java Stream 来迭代这个集合,然后将每个 object 的typeName字段(即一个字符串)添加到数组中作为输入方法使用的参数。
在前面的代码中,您可以找到(注释掉)我所做的尝试,但 Eclipse 给我错误,所以这是错误的。
如何尝试使用 Java Stream 来实现此行为?
.claim("user_profiles",userDetailsWrapper.getUserCompleteInfo()
.getUserTypes().stream()
.map(UserType::getTypeName)
.collect(Collectors.toList()))
您应该调用 map function 从 UserType object 获取 typeName。 请尝试上面的代码
您正在尝试转换为错误的类型
.claim("user_profiles", userDetailsWrapper.getUserCompleteInfo()
.getUserTypes()
.stream()
// Convert each UserType to a String using the getter for typeName field
.map(UserType::getTypeName)
// Create a list from the Stream of TypeName strings
.collect(Collectors.toList()))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.