Lis*_*sek 3 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;
}
Run Code Online (Sandbox Code Playgroud)
我有一个List<Customer>. 我想用 Java 流分割这样的列表,以便我得到 ids List<Integer>、 countries List<String>、 customerIdsList<Integer>等的列表。
我知道我可以像制作 6 个流一样简单,例如:
List<Integer> idsList = customerList.stream()
.map(Customer::getId)
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
但是在我有字段的情况下这样做很多次似乎很乏味。我正在考虑自定义收集器,但我无法想出任何既简洁又高效的有用的东西。
对于类型安全的解决方案,您需要定义一个包含所需结果的类。这种类型还可以提供添加另一个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);
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以收集所有结果,例如
CustomerProperties all = customers.stream()
.collect(CustomerProperties::new, CustomerProperties::add, CustomerProperties::add);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1831 次 |
| 最近记录: |