Answered step by step
Verified Expert Solution
Link Copied!

Question

1 Approved Answer

package adminSite; package adminSite; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Collectors; import yourPrime.*; public class FuncUtil

image text in transcribed

image text in transcribed

package adminSite;

package adminSite;

import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Collectors;

import yourPrime.*;

public class FuncUtil { private Map userDb = new HashMap(); public FuncUtil(Map userDb) { this.userDb = userDb; } public Map getUserDb() { return userDb; } public void addSubscriber(Subscriber subscriber) { Supplier userId = () -> generateId().toString(); String id = userId.get(); subscriber.setUserID(id); userDb.putIfAbsent(id, subscriber); } public Integer generateId() { return new Random().nextInt(80000); } public boolean modifyPassword(String userId, String newPassword) { Subscriber subscriber = userDb.get(userId); subscriber.setPassword(newPassword); userDb.replace(userId, subscriber); if (userDb.get(userId).getPassword().equals(newPassword)) return true; else return false; } public boolean deleteSubscriber(String userId) { userDb.remove(userId); if (userDb.get(userId) == null) return true; else return false; } // TODO refactor the implementation of the searchSubscriber() method using Java 8 stream // and lambda expression. You can also use the existing interfaces if you prefer (but not required). // public List searchSubscriber(String keyword) { // TIP: // declare a list with type subscriber that will store the search result // you will need to return this list // use your subscriber map (check instance variable declared on top of this class) as stream, and // filter your data for matching keywords in user id or name (you can use predicate or lambda expression) // } // TODO refactor the implementation of the total sum of fees calculation using Java 8 streams // and lambda expression. You can also use the exisiting interfaces if you prefer (but not required). // public double calculateOverdueFees() { // TIP: // declare a variable type double that will store the result of total summation of fees, // use your subscriber map as stream, and include the necessary operations to get total sum using // the subscriber getFees() method (with lambda expersson or method reference // } // TODO refactor the implementation of the printAllSubscriber() method here with Java 8 stream and method // reference. You MUST use the function interface already defined here. The method will also print out the // details according to the sort by option - name of the subscriber, and the outstanding fees. // public void printAllSubscribers(String sortBy) { // TIP: // use the function interface as string that you print out // Function details = p -> p.getName() + " with outstanding amount = " + String.format("%.2f", p.getFees()); // you need a condition to check for the sortBy argument, use the subscriber map as stream source, and include the necessary // operations to sort (based on the argument type) and print out the string for each subscriber // } // TODO create a method to return the average outstanding fees from all accounts using Java 8 stream and lambda expression. // public double getAverageOutstanding() { // TIP: // declare a variable type double that will store the results of an average operation - you will return this value // use subscriber map as stream input and include necessary operations to calculate average // } // TODO create a method to return the outstanding fees from all accounts group by the media type. // You should make use of Java 8 Streams and lambda expression to do this - return map // public Map getTotalFeesGroupByMedia() { // TIP: // declare a map collection that will store the total fees you generate - check out the generic types // for your map as per the method signature. // // Check MyMedia class and explore the getters you can call for each media type. // For each subscriber, you need to calculate the total fees for each media type. As you traverse your // subscriber map, you will then call the list of each media, and calculate the total. // // For e.g., if you have 5 subscribers, you will have 4 list of Movie, Book and Song. So you need to // calculate the total fees for all movies, and then all books and lastly, all songs. // // *SECRET TIP: // With Java Stream, lambda expression and method reference, you can do this in 3 lines // (one for each media type). Use subscriber stream to get media, then invidividual list can be // processed as stream (all in a single pipeline) - but don't get hung up on it, use anything that you're // comfortable with ! -> the read tip :) // Map mapMedia = new HashMap(); } // TODO create a method to return the total number of items from all accounts using Java 8 streams and lambda expression. // group by the media type. Use the programming logic (idioms) that you've implemented in the getTotalFeesGroupByMedia() // method as a source of inspiration in completing this method. // public Map getCountGroupByMedia() { // TIP: // This will be exactly like the getTotalFeesByGroupMedia() method above. You just need to return the count // instead of the total sum. You will return three values (in a map) for each media type. The generic types // assigned to the map collection are a good clue to figure out the operators that you will use to construct // your stream pipeline/ // // *SECRET TIP: // Don't reinvent the wheel, use what you already created above - just replace the operator // Map mapMedia = new HashMap(); } }

The method implementations in FuncUtil (in the AdminSite package) are largely based on functional interface. However, these interfaces can be better implemented using lambda expression or / and Java 8 streams. In doing so, you will be able to simplify your codes, and at the same time improve the clarity and readability aspects. We will revisit the YourPrime program for this programming assignment, so, you should be familiar with the skeleton codes. The core of the program (yourPrime package) is pretty much unchanged, however, there are a few minor additions made to facilitate the assignment. For this tasks, you are required to refactor the following methods: 1 - searchSubcriber (String keyword) : use Java 8 Streams, and lambda expression to create the pipeline to search for a keyword in the user ID and name attributes of Subscriber. You should collect your stream as a List> and then return the list =[1 Mark ] 2 - calculateoverdueFees () : use Java 8 Streams, and lambda expression to return the total sum of the fees for all subscribers = [1 Mark]. 3 - printallsubscribers (String sortBy) : use Java 8 Streams, and method reference to print out a sorted list according to the argument sortBy. You must use the Function interface provided in the method to map your stream before printing your output. You can either sort the list by the subscriber's name, or their outstanding fees = [2 Marks]. 4 - getAverageoutstanding () : use Java 8 Streams and method reference to generate the average outstanding value, and return the amount =[1 Mark ]. Note: Use the comments available in the method body to help you in completing this task. It's important to not overthink the solution, you are basically writing a Java 8 version of function interface implementation, and it should be simple. Having said that, do remember that it is best to use simple java codes whenever possible. Task 02: Quick Fire (5 marks) The media streaming business is very dynamic. Changes occur every second (alright, not every second, but you get the point). Most of the utility methods that you've implemented in Task 01 are essential to for administrative purpose. However, we need to do more, especially in this data oriented business. We need to have some rapid fire methods to pull vital information from our streaming program. There will be loads, but we must be realistic (the task is only worth 5 marks). Therefore, we are going to look at the two most important information to have in-hand, so the management would be happy to get rapid response from us. 1 - You are required to complete the getTotalFeesGroupByMedia() method to provide the current outstanding fees from all subscribers group by the media type, e.g., given the data of all subscriber for that particular month, the method will return the total fees for Movies, for Books, and for Songs. This information can help the management to decide, which media is the most profitable, and they can decide for possible adjustment in the future, i.e., maybe buying more movies for the library (to keep things fluid). Similar to Task 01, you need to use Java 8 Streams, lambda expression and (or) method references to complete this task. There are getters provided in the MyMedia class to help facilitate this operation. Read the comments in the method body for details. The solution is simple, but make sure you cater your solution to the current structure of the program (i.e., check what is available in the codes, and work it out from there) = [ 3 marks]. 2 - You are required to complete the getCountGroupByMedia () method to return the number of items available inside each subscriber media library, group by the media type, e.g., Given the library of subscriber A as (Movie - 3, Book - 2, Song - 3), and subscriber B as (Movie - 2, Book - 1, Song - 2), your method should return (Movie - 5, Book - 3, Song - 5) - the total count for each media for all subscribers. This will give the management an opportunity to evaluate the popularity of item in respect to the media type - again, this can be a factor to determine future media offerings (this time based on user consumption). As a good programmer, you should be able to adapt the programming idiom that you've previously applied in getTotalFeesGroupByMedia () method. The logic is essential the same, and you only need to call a different intermediate and terminal operators for your streams. There is no point of re-inventing the wheels (even the marks allocated here reflect that = [2 Marks]

Step by Step Solution

There are 3 Steps involved in it

Step: 1

blur-text-image

Get Instant Access to Expert-Tailored Solutions

See step-by-step solutions with expert insights and AI powered tools for academic success

Step: 2

blur-text-image

Step: 3

blur-text-image

Ace Your Homework with AI

Get the answers you need in no time with our AI-driven, step-by-step assistance

Get Started

Recommended Textbook for

SQL Server Query Performance Tuning

Authors: Sajal Dam, Grant Fritchey

4th Edition

1430267429, 9781430267423

More Books

Students also viewed these Databases questions

Question

If you were Akio, what would you do now?

Answered: 1 week ago