Skip to content

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;
    }
}

Clone this wiki locally