簡體   English   中英

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?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM