How to Group and Partition Collectors in Java 8

  • google plus

In Brief...

The Collectors class in Java 8 provides methods for grouping and partitioning data stored in collections. Grouping permits you to organize data that shares a common field value, e.g. department. Partitioning allows you to divide the data into two categories, or partitions. One partition satisfies the partitioning criteria whereas the other partition does not. For example, we might separate sales data into a partition that met or exceeded a sales goal and a partition that did not. Our case study below will apply grouping and partitioning technology to a collection of musical instruments.

Take our Introduction to Java Training course for free.

See the Course Outline and Register

Instructions

  1. Open your text editor and create the Java program that will define the musical instrument class. Type in the following Java statements:
    
    public class MusicalInstrument {
    	private String name;
    	private String type;
    	private double price;
    	public MusicalInstrument(String name, String type, double price) {
    		setName(name);
    		setType(type);
    		setPrice(price);
    	}	
    	public String getName() {
    		return name;
    	}
    	public void setName (String name) {
    		this.name=name;
    	}
    	public String getType() {
    		return type;
    	}
    	public void setType (String type) {
    		this.type=type;
    	}
    	public double getPrice() {
    		return price;
    	}
    	public void setPrice (double price) {
    		this.price=price;
    	}
    	public String toString() {
    		return name + " is a " + type + " instrument that costs " + price + " dollars";
    	}	
    }		
    	
    This is a straightforward Java bean that defines name, type, and price properties for a musical instrument.
  2. Save your file as MusicalInstrument.java.
  3. Open a command prompt and navigate to the directory containing your new Java program. Then type in the command to compile the source and hit Enter.
    Compile Musical Instrument for Group and Partition
  4. Open your text editor and create the Java program that will use group and partition collectors for musical instrument data. Type in the following Java statements:
    
    import java.util.stream.*;
    import java.util.*;
    public class GroupAndPartitionCollectors {
    	private static List musicalInstruments=new ArrayList<>();
    	static {
    		musicalInstruments.add(new MusicalInstrument("Trumpet","brass",299.99));
    		musicalInstruments.add(new MusicalInstrument("Tuba","brass",1149.0));
    		musicalInstruments.add(new MusicalInstrument("Timpani","percussion",2339.0));
    		musicalInstruments.add(new MusicalInstrument("Snare drum","percussion",325.00));
    		musicalInstruments.add(new MusicalInstrument("Piano","keyboard",5179.99));
    		musicalInstruments.add(new MusicalInstrument("Trombone","brass",775.79));
    	}
    	public static void main (String args[]) {
    		System.out.println("Musical instruments in the collection:");
    		musicalInstruments
    		.stream()
    		.forEach(instrument->System.out.println(instrument) );
    		
    		System.out.println("Group by type:");
    		Map > typeMap= musicalInstruments
    		.stream()
    		.collect(Collectors.groupingBy(MusicalInstrument::getType));
    		typeMap.forEach( (key, value)-> {System.out.println(key); value.forEach(System.out::println);});
    		
    		System.out.println("Partition by Affordable (less than or equal to $500) or Expensive (greater than $500) :");
    		Map > priceMap= musicalInstruments
    		.stream()
    		.collect(Collectors.partitioningBy(musicalInstrument -> musicalInstrument.getPrice() > 500.0));
    		priceMap.forEach( (key, value)-> {System.out.println((key? "Expensive ":"Affordable")); value.forEach(System.out::println);});
    	}
    }
    	
    The stream will be created from the ArrayList that is defined on line 4. The program displays the entire collection of musical instruments before applying the groupingBy method. This method from the Collectors class is responsible for organizing the data into groups. In this case, the groups are defined by instruments belonging to the same type (e.g., "brass"). The collect method from the Stream class accepts the groupingBy method as its argument and returns a map containing the results. The program displays the results. Next, the partitioningBy method of the Collectors class is called to partition the data into "Affordable" instruments (price less than or equal to $500) and "Expensive" instruments (price greater than $500). I have highlighted the grouping method and the partitioning method in the image below:
    Java Source for Group Partition
  5. Save your file as GroupAndPartitionCollectors.java.
  6. Open a command prompt and navigate to the directory containing your new Java program. Then type in the command to compile the source and hit Enter.
    Compile Program with Group Partition
  7. You are ready to test your Java program. Type in the command to run the Java runtime launcher and hit Enter. The output displays the original list of musical instruments followed by the list of instruments collected by group and then the list of instruments partitioned by price.
    Run Program with Group Partition

Author: Stephen Withrow

Stephen has over 30 years' experience in training, development, and consulting in a variety of technology areas including Java, C, C++, XML, JavaScript, AJAX, Tomcat, JBoss, Oracle, and DB2. His background includes design and implementation of business solutions on client/server, Web, and enterprise platforms. Stephen is a published writer in both technical and non-technical endeavors. Stephen received an undergraduate degree in Computer Science and Physics from Florida State University.

Discuss