转换为
Streams
:
private static List<Location> extractLocation(List<Location> locations){
List<Location> locationList = new ArrayList<>();
for(Location l : locations){
if(l!=null){
final Location location = Location.builder()
.id(l.getId())
.build();
for(Address address: l.getAddresses()){
if(address.getType().equals("primary")){
location.setPrimaryAddress(address);
}
else{
location.setBillingAddress(address);
}
}
locationList.add(location);
}
}
return locationList;
}
构建对象后我陷入困境。对于嵌套循环,由于这是构建
Location object
后的下一步,因此在此应用 Stream method
来设置主要地址和账单地址。
private static List<Location> extractLocationStream(List<Location> locations){
return locations.stream()
.filter(location -> location!=null)
.map(location ->
{
Location l = Location.builder()
.id(location.getId())
.build();
location.getAddresses().stream()
.filter(address -> address.getType().equals("primary")).// what to do now
})
.collect(Collectors.toList());
}
要使用 Java Streams 设置主要地址和账单地址,您可以使用 Collectors.toMap 在映射操作中按地址类型对地址进行分组。以下是您可以修改 extractLocationStream 方法来实现此目的的方法:
private static List<Location> extractLocationStream(List<Location> locations) {
return locations.stream()
.filter(location -> location != null)
.map(location -> {
Location.Builder locationBuilder = Location.builder() .id(location.getId());
Map<String, Address> addressMap = location.getAddresses().stream()
.collect(Collectors.toMap(Address::getType, address -> address));
locationBuilder.primaryAddress(addressMap.get("primary"));
locationBuilder.billingAddress(addressMap.get("billing"));
return locationBuilder.build();
})
.collect(Collectors.toList());
}
在此代码中: