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]