java - 使用 Java 流将对象列表拆分为多个字段值列表

标签 java java-8 java-stream

假设我有这样的对象:

public class Customer {

    private Integer id;
    private String country;
    private Integer customerId;
    private String name;
    private String surname;
    private Date dateOfBirth;
}

我有一个 List<Customer> .我想用 Java 流拆分这样的列表,以便获得一个 ID 列表 List<Integer> , 国家 List<String> , 客户 ID List<Integer>等等

我知道我可以像制作 6 个流一样简单,例如:

List<Integer> idsList = customerList.stream()
        .map(Customer::getId)
        .collect(Collectors.toList());

但是在我拥有字段的情况下多次这样做似乎很乏味。我在考虑自定义收集器,但我想不出任何既整洁又高效的有用的东西。

最佳答案

对于类型安全的解决方案,您需要定义一个包含所需结果的类。此类型还可能提供添加另一个 Customer 或部分结果的必要方法:

public class CustomerProperties {
    private List<Integer> id = new ArrayList<>();
    private List<String> country = new ArrayList<>();
    private List<Integer> customerId = new ArrayList<>();
    private List<String> name = new ArrayList<>();
    private List<String> surname = new ArrayList<>();
    private List<Date> dateOfBirth = new ArrayList<>();

    public void add(Customer c) {
        id.add(c.getId());
        country.add(c.getCountry());
        customerId.add(c.getCustomerId());
        name.add(c.getName());
        surname.add(c.getSurname());
        dateOfBirth.add(c.getDateOfBirth());
    }
    public void add(CustomerProperties c) {
        id.addAll(c.id);
        country.addAll(c.country);
        customerId.addAll(c.customerId);
        name.addAll(c.name);
        surname.addAll(c.surname);
        dateOfBirth.addAll(c.dateOfBirth);
    }
}

然后,您可以收集所有结果,例如

CustomerProperties all = customers.stream()
    .collect(CustomerProperties::new, CustomerProperties::add, CustomerProperties::add);

关于java - 使用 Java 流将对象列表拆分为多个字段值列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60266230/

相关文章:

nullpointerexception - JavaFx : Error Cannot be ideantified

使用 Stream 的 Java 8 模式谓词 - 如何推断变量?

java - Java 8 Streams 中的过滤映射

java - 如何避免使用许多 @SerializedName ?

java - 如何在 Firestore 中使用 POJO 更新所有文档中的一个字段?

java - 从 Tomcat 7 迁移到 Tomcat 9 后的 "Too many open files"

java - 关闭 Java 8 JDK 安装的自动更新

Java 8-Lambda 表达式和流来迭代 HashMap 的 HashMap

Java流: Nested Stream lookup Over Multiple List throws NPE

java - apache ivy 和 osgi 包中的嵌套 jar 文件