Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Use a lambda expression to reduce code duplication when searching a book catalog

ID: 3797929 • Letter: U

Question

Use a lambda expression to reduce code duplication when searching a book catalog for certain types of books

1- Import the code for this application and run it to make sure it works Then, review the books filtered by title, category, and format correctly.

here is the code for the bookCatalog

package murach.bookcatalog;

import java.util.ArrayList;
import java.util.List;

public class BookCatalog {
    private List<Book> bookCatalog;
  
    public BookCatalog() {
        bookCatalog = new ArrayList<>();
        bookCatalog.add(new Book("PHP and MySQL", Book.WEB, Book.ELECTRONIC));
        bookCatalog.add(new Book("MySQL", Book.DATABASE, Book.PAPERBACK));
        bookCatalog.add(new Book("MySQL", Book.DATABASE, Book.ELECTRONIC));
        bookCatalog.add(new Book("Dreamweaver", Book.WEB, Book.ELECTRONIC));
        bookCatalog.add(new Book("Java Servlets and JSP", Book.JAVA, Book.PAPERBACK));
        bookCatalog.add(new Book("Java Servlets and JSP", Book.JAVA, Book.ELECTRONIC));
        bookCatalog.add(new Book("C# 2012", Book.DOTNET, Book.ELECTRONIC));
        bookCatalog.add(new Book("Visual Basic 2012", Book.DOTNET, Book.ELECTRONIC));
        bookCatalog.add(new Book("SQL Server 2012", Book.DATABASE, Book.ELECTRONIC));
        bookCatalog.add(new Book("Oracle SQL and PL/SQL", Book.DATABASE, Book.ELECTRONIC));
        bookCatalog.add(new Book("HTML5 and CSS3", Book.WEB, Book.ELECTRONIC));
        bookCatalog.add(new Book("JavaScript and jQuery", Book.WEB, Book.ELECTRONIC));
        bookCatalog.add(new Book("Java Programming", Book.JAVA, Book.PAPERBACK));
        bookCatalog.add(new Book("Java Programming", Book.JAVA, Book.ELECTRONIC));
        bookCatalog.add(new Book("Android Programming", Book.MOBILE, Book.PAPERBACK));
        bookCatalog.add(new Book("Android Programming", Book.MOBILE, Book.ELECTRONIC));
        bookCatalog.add(new Book("JavaScript and DOM Scripting", Book.WEB, Book.ELECTRONIC));
    }
  
    public List<Book> getCatalog() {
        return bookCatalog;
    }
}

It should look like this

BOOKS BY TITLE:

[Java Programming, Java, Paperback]

[Java Programming, Java, Electronic]

BOOKS BY CATEGORY:

[Java Servlets and JSP, Java, Paperback]

[Java Servlets and JSP, Java, Electronic]

[Java Programming, Java, Paperback]

[Java Programming, Java, Electronic]

BOOKS BY FORMAT:

[MySQL, Database, Paperback]

[Java Servlets and JSP, Java, Paperback]

[Java Programming, Java, Paperback]

[Android Programming, Mobile, Paperback]

2- open the BookManager class and examine these three methods: getBooksBy Title, getBooksByTech, and Note the code for these methods is almost identical, except for the condition at the beginning of the if statement

Bookmanger codes

package murach.bookcatalog;

import java.util.ArrayList;
import java.util.List;

public class BookManager {
    private List<Book> bookList;
  
    public BookManager() {
        bookList = new BookCatalog().getCatalog();
    }
  
    public List<Book> getBooksByTitle(String title) {
        List<Book> books = new ArrayList<>();
        for (Book b : bookList) {
            if (b.getTitle().equals(title)) {
                books.add(b);
            }
        }
        return books;
    }
  
    public List<Book> getBooksByCategory(String category) {
        List<Book> books = new ArrayList<>();
        for (Book b : bookList) {
            if (b.getCategory().equals(category)) {
                books.add(b);
            }
        }
        return books;
    }
  
    public List<Book> getBooksByFormat(String format) {
        List<Book> books = new ArrayList<>();
        for (Book b : bookList) {
            if (b.getFormat().equals(format)) {
                books.add(b);
            }
        }
        return books;
    }
}

3. Add a functional interface named TestBook that includes a method named test that accepts a Book object as a parameter and returns a boolean value.

4. In the BookManager class, add a single method named getBooksByLambda that accepts a TestBook object as a parameter and uses its test method in the condition at the beginning of the if statement

5. open the Main class and replace the old calls to the methods of the etBooksBy method class three calls to the new To do that, you'll need to pass a lambda expression as an argument to thi method. For example, here's the lambda expression to test the title of a bock b b.getTitle.equals("Java Programming"

mainclass codes

package murach.bookcatalog;

import java.util.List;

public class Main {

    public static void main(String[] args) {
        BookManager manager = new BookManager();
      
        List<Book> booksByTitle = manager.getBooksByTitle("Java Programming");
        System.out.println(" BOOKS BY TITLE:");
        printList(booksByTitle);
      
        List<Book> booksByCategory = manager.getBooksByCategory(Book.JAVA);
        System.out.println(" BOOKS BY CATEGORY:");
        printList(booksByCategory);
      
        List<Book> booksByFormat = manager.getBooksByFormat(Book.PAPERBACK);
        System.out.println(" BOOKS BY FORMAT:");
        printList(booksByFormat);
      
    }
  
    public static void printList(List<Book> bookList) {
        for (Book b : bookList) {
            System.out.println(b);
        }
    }
}

6. In the BookManager class, delete the getBooksByTitle getBooksByTech and and getBooksByFormat methods, Note how this reduces code duplication increases the flexibility of your code

7. Run the application and test it to MAke sure it works correctly. It should print the same list to the console as in step one

Explanation / Answer

Please copy each class into a seperate java files because all of them are declared as "public"


package murach.bookcatalog;
import java.util.List;


public class Main {

    public static void main(String[] args) {
        BookManager manager = new BookManager();
      
        TestBook test = (Book b) -> b.getTitle().equals("Java Programming");
        List<Book> booksByTitle = manager.getBooksByLambda(test);
      
        System.out.println(" BOOKS BY TITLE:");
        printList(booksByTitle);
      
      
        test = (Book b) -> b.getCategory().equals(Book.JAVA);
        List<Book> booksByCategory = manager.getBooksByLambda(test);
      
        System.out.println(" BOOKS BY CATEGORY:");
        printList(booksByCategory);
      
      
        test = (Book b) -> b.getFormat().equals(Book.PAPERBACK);
        List<Book> booksByFormat = manager.getBooksByLambda(test);
      
        System.out.println(" BOOKS BY FORMAT:");
        printList(booksByFormat);
      
    }
  
    public static void printList(List<Book> bookList) {
        for (Book b : bookList) {
            System.out.println(b);
        }
    }
}


-----------------------------------------------------------------------------------------------------

package murach.bookcatalog;

public interface TestBook {
  
   /* Takes in Book object and returns a boolean value */
   public boolean test(Book book);
}

-----------------------------------------------------------------------------------------------------


package murach.bookcatalog;
import java.util.ArrayList;
import java.util.List;


public class BookManager {
    private List<Book> bookList;
  
    public BookManager() {
        bookList = new BookCatalog().getCatalog();
    }
  
    public List<Book> getBooksByLambda(TestBook testBook) {
        List<Book> books = new ArrayList<>();
        for (Book b : bookList) {
            if (testBook.test(b)) {
                books.add(b);
            }
        }
        return books;
    }
}

-----------------------------------------------------------------------------------------------------

package murach.bookcatalog;
import java.util.ArrayList;
import java.util.List;

public class BookCatalog {
  
    private List<Book> bookCatalog;
  
    public BookCatalog() {
        bookCatalog = new ArrayList<>();
        bookCatalog.add(new Book("PHP and MySQL", Book.WEB, Book.ELECTRONIC));
        bookCatalog.add(new Book("MySQL", Book.DATABASE, Book.PAPERBACK));
        bookCatalog.add(new Book("MySQL", Book.DATABASE, Book.ELECTRONIC));
        bookCatalog.add(new Book("Dreamweaver", Book.WEB, Book.ELECTRONIC));
        bookCatalog.add(new Book("Java Servlets and JSP", Book.JAVA, Book.PAPERBACK));
        bookCatalog.add(new Book("Java Servlets and JSP", Book.JAVA, Book.ELECTRONIC));
        bookCatalog.add(new Book("C# 2012", Book.DOTNET, Book.ELECTRONIC));
        bookCatalog.add(new Book("Visual Basic 2012", Book.DOTNET, Book.ELECTRONIC));
        bookCatalog.add(new Book("SQL Server 2012", Book.DATABASE, Book.ELECTRONIC));
        bookCatalog.add(new Book("Oracle SQL and PL/SQL", Book.DATABASE, Book.ELECTRONIC));
        bookCatalog.add(new Book("HTML5 and CSS3", Book.WEB, Book.ELECTRONIC));
        bookCatalog.add(new Book("JavaScript and jQuery", Book.WEB, Book.ELECTRONIC));
        bookCatalog.add(new Book("Java Programming", Book.JAVA, Book.PAPERBACK));
        bookCatalog.add(new Book("Java Programming", Book.JAVA, Book.ELECTRONIC));
        bookCatalog.add(new Book("Android Programming", Book.MOBILE, Book.PAPERBACK));
        bookCatalog.add(new Book("Android Programming", Book.MOBILE, Book.ELECTRONIC));
        bookCatalog.add(new Book("JavaScript and DOM Scripting", Book.WEB, Book.ELECTRONIC));
    }
  
    public List<Book> getCatalog() {
        return bookCatalog;
    }
}


-----------------------------------------------------------------------------------------------------

package murach.bookcatalog;

class Book {
  
   public static String WEB = "WEB";
   public static String JAVA = "JAVA";
   public static String DATABASE = "DATABASE";
   public static String MOBILE = "MOBILE";
   public static String DOTNET = "DOTNET";
  
   public static String ELECTRONIC = "ELECTRONIC";
   public static String PAPERBACK = "PAPERBACK";
  
   public String title;
   public String category;
   public String format;
  
   public Book(String title, String type, String format) {
       this.title = title;
       this.category = type;
       this.format = format;
   }

   public String getTitle() {
       return title;
   }

   public void setTitle(String title) {
       this.title = title;
   }

   public String getCategory() {
       return category;
   }

   public void setCategory(String category) {
       this.category = category;
   }

   public String getFormat() {
       return format;
   }

   public void setFormat(String format) {
       this.format = format;
   }

   @Override
   public String toString() {
       return "["+title + ", "+ category +", "+ format + "]";
   }
  
}

-----------------------------------------------------------------------------------------------------

Output :

BOOKS BY TITLE:
[Java Programming, JAVA, PAPERBACK]
[Java Programming, JAVA, ELECTRONIC]

BOOKS BY CATEGORY:
[Java Servlets and JSP, JAVA, PAPERBACK]
[Java Servlets and JSP, JAVA, ELECTRONIC]
[Java Programming, JAVA, PAPERBACK]
[Java Programming, JAVA, ELECTRONIC]

BOOKS BY FORMAT:
[MySQL, DATABASE, PAPERBACK]
[Java Servlets and JSP, JAVA, PAPERBACK]
[Java Programming, JAVA, PAPERBACK]
[Android Programming, MOBILE, PAPERBACK]