Frequency Map in Java 8+

Frequency Map in Java 8 or above can be created concisely with the help of Stream and Collectors.groupingBy() API.

A general method to count frequency of elements:

import java.util.stream.*;
import java.util.*;
import java.util.function.*;
<T> Map<T, Long>  frequencyMap(Stream<T> elements) {
return elements.collect(
  Collectors.groupingBy(
    Function.identity(),
    HashMap::new, // can be skipped
    Collectors.counting()
  )
);
}

Any streamable and countable collection can utilise the above method to count the frequency of elements.

Frequency Map of List Elements

A list can be converted to stream by calling stream().

List<String> words = Arrays.asList("hello", "hello", "mighty");
frequencyMap(words.stream());

Frequency Map of Characters Array

An array of Character can be converted to Stream using Arrays.stream()

Character[] letters = {'a', 'b', 'b', 'c', 'c', 'c'};
frequencyMap(Arrays.stream(letters));

Frequency Map of Characters from String

String characters can be converted to stream chars(). However, it returns intergers stream instead of charcters stream; Each integer needs to be converted back to character using maptoObj method as:

String aString = "abc"
frequencyMap(aString.chars().mapToObj(c -> (char) c));

Frequency Map of Integers Array or unboxed type

An array of unboxed typed elements can be converted to Stream using Arrays.stream() and calling boxed()

int [] numbers = {1, 2, 3};
frequencyMap(Arrays.stream(numbers).boxed());

See it in action → https://repl.it/@DM8tyProgrammer/frequency

Be Updated

Only articles are shared on Medium