-1

我正在开发一个 Java 应用程序,我正在尝试使用Stream概念实现以下行为。

我正在尝试做一些类似于我在示例中发现的事情,但我的用例似乎更复杂。这是原始示例:

String[] profili = utente.getRuoli()
                  .stream().map(a -> "ROLE_" + a).toArray(String[]::new);

基本上,它是从流开始创建一个数组。

按照我的情况。我有这个代表用户的主要用户DTO 类:

@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;   
}

前面的 DTO 类包含表示用户类型集合的此字段(例如“ADMIN”、“READER”、“WRITER”等)。这是因为一个用户可以有多种类型:

private Set<UserType> userTypes;

这是用户类型结构:

@Data
public class UserType {
    private int id;
    private String typeName;
    private String description;
    Set<Operation> operations;
}

这个类还包含一个表示操作集合的字段(这是因为一个用户类型可以有多个可以在系统上执行的操作),这个字段:

Set<Operation> operations;

这是Operation类结构:

@Data
public class Operation {
    
    private int id;
    private String name;
    private String description;

}

现在我问我是否可以以与原始示例类似的方式使用流,以便创建包含在所有用户类型中的所有操作的数组。

我尝试按照以下方式进行操作:

String[] operations = user.getUserTypes().stream()
          .map(UserType::getOperations)
          .flatMap(Set::stream)
          .distinct()
          .toArray(String[]::new);

但是当执行此代码时,我得到以下异常:

java.lang.ArrayStoreException: arraycopy: element type mismatch: can not cast one of the elements of java.lang.Object[] to the type of the destination array, java.lang.String
    at java.base/java.lang.System.arraycopy(Native Method) ~[na:na]

我认为这是因为我必须创建一个 String 数组,但它正在处理不是 String 实例的Operation实例。理论上,我必须将当前Operation实例的name字段的值放入我的新数组中。

如何尝试修复此代码?

4

1 回答 1

1

您需要将您Operation的 s 映射到字符串name,如下所示:

String[] operations = user.getUserTypes().stream()
    .map(UserType::getOperations)
    .flatMap(Set::stream)
    .map(Operation::getName)
    .distinct()
    .toArray(String[]::new);
于 2021-11-17T16:02:44.313 回答