-
Notifications
You must be signed in to change notification settings - Fork 0
Example of refactoring
simiyutin edited this page Dec 25, 2016
·
2 revisions
Assuming we have following piece of code:
public class Main {
public static void main(String[] args) {
ArrayList<Invoice> allInvoices= new ArrayList<>();
allInvoices.add(new Invoice());
List<Invoice> test2 = findInvoicesFromMicrosoft(allInvoices);
List<Invoice> test3 = findInvoicesFromOracle(allInvoices);
}
public static List<Invoice> findInvoicesFromOracle(List<Invoice> invoices) {
List<Invoice> result = new ArrayList<>();
for(Invoice invoice: invoices) {
if(invoice.getCustomer() == Customer.ORACLE) {
result.add(invoice);
}
}
return result;
}
public static List<Invoice> findInvoicesFromMicrosoft(List<Invoice> invoices) {
List<Invoice> result = new ArrayList<>();
for(Invoice invoice: invoices) {
if(invoice.getCustomer() == Customer.MICROSOFT) {
result.add(invoice);
}
}
return result;
}
}
after built-in IDEA to-streams refactoring mechanism we obtain:
public static List<Invoice> findInvoicesFromOracle(List<Invoice> invoices) {
List<Invoice> result = invoices.stream().filter(invoice -> invoice.getCustomer() == Customer.ORACLE).collect(Collectors.toList());
return result;
}
public static List<Invoice> findInvoicesFromMicrosoft(List<Invoice> invoices) {
List<Invoice> result = invoices.stream().filter(invoice -> invoice.getCustomer() == Customer.MICROSOFT).collect(Collectors.toList());
return result;
}
After extraction parameters as lambdas:
public static void main(String[] args) {
ArrayList<Invoice> allInvoices= new ArrayList<>();
allInvoices.add(new Invoice());
List<Invoice> test2 = findInvoicesFromMicrosoft(allInvoices, invoice -> invoice.getCustomer() == Customer.MICROSOFT);
List<Invoice> test3 = findInvoicesFromOracle(allInvoices, invoice -> invoice.getCustomer() == Customer.ORACLE);
}
public static List<Invoice> findInvoicesFromOracle(List<Invoice> invoices, Predicate<Invoice> invoicePredicate) {
List<Invoice> result = invoices.stream().filter(invoicePredicate).collect(Collectors.toList());
return result;
}
public static List<Invoice> findInvoicesFromMicrosoft(List<Invoice> invoices, Predicate<Invoice> invoicePredicate) {
List<Invoice> result = invoices.stream().filter(invoicePredicate).collect(Collectors.toList());
return result;
}
At this point it is clear, that functions findInvoicesFromOracle and findInvoicesFromMicrosoft became duplicates. All file after removing duplicates:
public class Main {
public static void main(String[] args) {
ArrayList<Invoice> allInvoices= new ArrayList<>();
allInvoices.add(new Invoice());
List<Invoice> test2 = findInvoicesByPredicate(allInvoices, invoice -> invoice.getCustomer() == Customer.MICROSOFT);
List<Invoice> test3 = findInvoicesByPredicate(allInvoices, invoice -> invoice.getCustomer() == Customer.ORACLE);
}
public static List<Invoice> findInvoicesByPredicate(List<Invoice> invoices, Predicate<Invoice> invoicePredicate) {
List<Invoice> result = invoices.stream().filter(invoicePredicate).collect(Collectors.toList());
return result;
}
}