如何使用 Java Stream 修复此嵌套集合代码,以便从对象的 属性 创建字符串数组?
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?
我正在开发一个 Java 应用程序,我正在尝试使用 Stream 概念实现以下行为。
我正在尝试做一些类似于我在示例中发现的事情,但我的用例似乎更复杂。这是原始示例:
String[] profili = utente.getRuoli()
.stream().map(a -> "ROLE_" + a).toArray(String[]::new);
基本上,它是从流开始创建一个数组。
按照我的情况。我有这个主要的 User DTO class 代表一个用户:
@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 class 包含表示用户类型集合的字段(例如“ADMIN”、“READER”、“WRITER”等)。这是因为一个用户可以有多种类型:
private Set<UserType> userTypes;
这是 UserType 结构:
@Data
public class UserType {
private int id;
private String typeName;
private String description;
Set<Operation> operations;
}
另外这个class包含一个表示操作集合的字段(这是因为用户类型可以有多个可以在系统上执行的操作),这个字段:
Set<Operation> operations;
这是操作 class结构:
@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 数组,但它正在处理 Operation 不是 String 实例的实例。理论上,我必须将当前 Operation 实例的 name 字段的值放入我的新数组中。
我该如何尝试修复此代码?
您需要将 Operation
映射到字符串 name
,如下所示:
String[] operations = user.getUserTypes().stream()
.map(UserType::getOperations)
.flatMap(Set::stream)
.map(Operation::getName)
.distinct()
.toArray(String[]::new);
我正在开发一个 Java 应用程序,我正在尝试使用 Stream 概念实现以下行为。
我正在尝试做一些类似于我在示例中发现的事情,但我的用例似乎更复杂。这是原始示例:
String[] profili = utente.getRuoli()
.stream().map(a -> "ROLE_" + a).toArray(String[]::new);
基本上,它是从流开始创建一个数组。
按照我的情况。我有这个主要的 User DTO class 代表一个用户:
@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 class 包含表示用户类型集合的字段(例如“ADMIN”、“READER”、“WRITER”等)。这是因为一个用户可以有多种类型:
private Set<UserType> userTypes;
这是 UserType 结构:
@Data
public class UserType {
private int id;
private String typeName;
private String description;
Set<Operation> operations;
}
另外这个class包含一个表示操作集合的字段(这是因为用户类型可以有多个可以在系统上执行的操作),这个字段:
Set<Operation> operations;
这是操作 class结构:
@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 数组,但它正在处理 Operation 不是 String 实例的实例。理论上,我必须将当前 Operation 实例的 name 字段的值放入我的新数组中。
我该如何尝试修复此代码?
您需要将 Operation
映射到字符串 name
,如下所示:
String[] operations = user.getUserTypes().stream()
.map(UserType::getOperations)
.flatMap(Set::stream)
.map(Operation::getName)
.distinct()
.toArray(String[]::new);