Sunday October 07, 2018
For converting from a Java collection say List<Foo> to any of several other collections List<Bar1>, List<Bar2>, ... rather than create separate FooListToBar1List, FooListToBar2List, ... methods a single generic FooListToBarList method and a series of Foo->Bar1, Foo->Bar2... converter functions can be more succinctly used. The below example converts a highly simplified List of SaleData objects to separate Lists of Customer and Product information, using a common generic saleDataListToItemList(saleDataList, converterFunction) method along with passed-in converter functions saleDataToCustomer and saleDataToProduct. Of particular note is how the converter functions are specified in the saleDataListToItemList calls. In the case of saleDataToCustomer, which takes two arguments (the SailData object and a Region string), a lambda expression is used, while the Product converter can be specified as a simple method reference due to it having only one parameter (the SailData object).
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Main {
public static void main(String[] args) {
List<SaleData> saleDataList = new ArrayList<>();
saleDataList.add(new SaleData("Bob", "radio"));
saleDataList.add(new SaleData("Sam", "TV"));
saleDataList.add(new SaleData("George", "laptop"));
List<Customer> customerList = saleDataListToItemList(saleDataList, sd -> Main.saleDataToCustomerWithRegion(sd, "Texas"));
System.out.println("Customers: ");
customerList.forEach(System.out::println);
List<Product> productList = saleDataListToItemList(saleDataList, Main::saleDataToProduct);
System.out.println("Products: ");
productList.forEach(System.out::println);
}
private static <T> List<T> saleDataListToItemList(List<SaleData> sdList, Function<SaleData, T> converter) {
// handling potentially null sdList: https://stackoverflow.com/a/43381747/1207540
return Optional.ofNullable(sdList).map(List::stream).orElse(Stream.empty()).map(converter).collect(Collectors.toList());
}
private static Product saleDataToProduct(SaleData sd) {
return new Product(sd.getProductName());
}
private static Customer saleDataToCustomerWithRegion(SaleData sd, String region) {
return new Customer(sd.getCustomerName(), region);
}
private static class SaleData {
private String customerName;
private String productName;
SaleData(String customerName, String productName) {
this.customerName = customerName;
this.productName = productName;
}
String getProductName() {
return productName;
}
String getCustomerName() {
return customerName;
}
}
private static class Product {
private String name;
Product(String name) {
this.name = name;
}
@Override
public String toString() {
return "Product{" +
"name='" + name + '\'' +
'}';
}
}
private static class Customer {
private String name;
private String region;
Customer(String name, String region) {
this.name = name;
this.region = region;
}
@Override
public String toString() {
return "Customer{" +
"name='" + name + '\'' +
", region='" + region + '\'' +
'}';
}
}
}
Output from running:
Customers:
Customer{name='Bob', region='Texas'}
Customer{name='Sam', region='Texas'}
Customer{name='George', region='Texas'}
Products:
Product{name='radio'}
Product{name='TV'}
Product{name='laptop'}
Posted by Glen Mazza in Programming at 03:00AM Oct 07, 2018 | Comments[0]